Any gain control medium will work. In the traditional (distorted) oscillator, average gain drops as clipping occurs. This need not manifest as obvious distortion. Example: a diff pair driving a resonant tank. The current waveform becomes distorted as the diff pair is driven into saturation (Vin > 30mV say), even if the output voltage never reaches saturation (due to an adequately low load resistance, but not so low that oscillation is hindered outright). In that case, output distortion is given by the current waveform as filtered by the resonant tank, which will be -20dB/dec typically.
Another example is a single transistor oscillator with the right biasing scheme, like this:
https://www.seventransistorlabs.com/Images/100MHzOsc.png note V(R15) and R19 set bias current, and V(R15) sets peak oscillation voltage (or something to that effect). At least, from my testing, this oscillator has a surprisingly wide and consistent range of bias versus output level, without breaking into squegging and without weird kinks and hysteresis in the transfer curve. (But not particularly low distortion, not at VOSC; that's what the bottom filter section is for.)
In a gain controlled oscillator, we simply have a more refined version of the traditional oscillator. All gain-control elements distort (heh, well, it may be more accurate to say
all things distort and just leave it as a matter of degree!), we're just looking for elements which distort less than the usual case, and, preferably, which are dependent so that we can wrap a control loop around it to get arbitrarily precise amplitude as well.
To that end, we have the diode or BJT (exponential [trans]conductance), FET (using the "triode" range of output curves, or the exponential or quadratic range of the transfer curve), and any kind of DAC, the most important being the multiplying DAC (switched R-2R ladder or "digital pot"), and the PWM DAC (which is identical to an analog mixer overdriven to give a square wave "LO").
We might exclude the (quantized) DAC due to steppiness of the amplitude response. Namely, if we put it in a loop, at best, it will dither between two nearly-perfect settings, never quite settling down. (In control terms, the incremental gain between steps is infinite, so there's a RHP pole, and it reduces to a hysteretic controller in the small-signal limit.) We can produce continuously variable PWM, which is nice, but the PWM ripple must be filtered arbitrarily well, which is awkward.
So that leaves the pure-analog methods. The lightbulb of course is a case of this, except for self-heating rather than an external control loop (or, you could use a bias tee to light it somewhat independently of the oscillator's signal, or any kind of external heating, like, uh... sure, let's just say laser-heating the filament, why not?). More practical to control, is the transistor-based method. Most FET controls are based on the triode region, so there you have it. BJTs are usually used in a more complicated circuit, such as an OTA, or a full on mixer or multiplier.
Drawback to these methods is probably split between distortion on one hand (simpler circuits) and noise on the other (complicated circuits with many transistors = noise sources).
FWIW, LDRs are surprisingly resistive, as far as I know -- despite being a semiconductor material. As mentioned, they do indeed have nasty time constants, in fact several piled up (or diffusion behavior, or some combination even). The main drawbacks basically come down to: CdS isn't RoHS, and the control loop can't run very fast (which probably makes an RF oscillator impossible to stabilize in this way).
Tim