I'm on an AMD machine, so GPU rendering is off the table, but I don't mind a lengthy render as long as the end result is good.
So far I've tried:
Rendering at 5000 samples
Various indirect/direct clamp values
Increasing volume sampling max steps
increasing volume bounces (in light paths)
And in all likelihood, a few things I've forgotten.
This render took 40 minutes with tons of settings cranked up, but still has a lot of visible noise despite being fairly small:
I'm using a volume scatter shader to add fog, one transparent plane using a procedural texture for the smoke.
It's worth noting that while I do not have a high-end machine, I also don't have a particularly horrible one either.