On theoretic level you will never be able to achieve perfectly smooth gradients. This is because the numeric color levels must use float numbers to calculate the gradient. As you need to convert floats to integer value (no decimal) there are introduced rounding errors which cause banding.
The technique to overcome rounding error has always been to introduce noise. Noise is what is the basis for dithering where you put noise in the lower value section where the rounding error present itself, to break up the uniformity of the rounding error in that area and therefor make it look more smooth.
There are different implementations of these techniques, some good, some not so good. I remember from the old days on the Amiga we used the algorithm developed by Floyd-Steinberg. It worked pretty well back then, and still do.
Even if you do get a "good looking" gradient inside your computer, there are other factors that will determine the final result such as the quality of your graphics card as well as your monitor. Modern days cards and monitors are in the same digital domain and can only work with integer values (ie. why 10-bits, 12-bits cards and screens where introduced so the rounding error is moved to an even lower value in the range these bit-resolutions represents) and suffer from rounding errors too (I'm not referring to the actual physical pixel itself as it is analogue, but the hardware and software drivers behind it).
There is not much you can do about that besides from introducing more noise in the graphics to even out transitions. If a commercial context you would need to use high quality card and monitor to be on the safe side (ie. from segments such as card supplier as f.ex. Matrox or monitor manufacturer Eizo works in).
(That being said, you can eliminate one step in the chain by hooking up a good old fashion CRT monitor that uses analogue signal to see if your monitor is limiting the representation or if your gfx card is - if you have an analogue output on your card that is. This not an accurate test of course, but gives you a pointer)