Yea that really breaks the usability a lot. I did a big list that checks what can be use in a good way. Lifetime, Size, Velocity, Location modules are all limited
Size and Velocity you can handle on the CPU, but I really try avoiding CPU particles since they are so slow. Lifetime there is no way to make it random, you could in theory have 2 lifetime modules but they are additive so you get pretty odd behaviours. Location module I can see no solution too.
On my last game we changed the engine to be able to send in custom parameters that we would remap with curves on the GPU, this worked great and is of course what you want.
On the bright side I think Niagara should be able to handle these parameters much better. I guess what we would want is remap a value like “Intensity” with a curve that is also multiplied with a random value. Do this for velocity, size, opacity, lifetime and you can do much more dynamic effects that can handle speed, wind etc well. I guess you would need to do special modules that support this behaviour.
Btw I like your tutorials, they are useful and well presented.