When it comes down to it, I would argue that there is no substitute for actually trying your software in production. For that reason, I try to write my code in a partitioned manner so that I can migrate nearly all of my code to a production environment without actually going 'live'. This may require a database switch that causes the 'write' portions of your code to point to a test database, or even (as may be the case with some major online retailers) require you to partition off a redundant portion of your production environment for a 'one box test'.
I really like this design, and I employ it myself. I find it very, very handy to be able to "go live" after I have tested the system in production (but not generally seen by everyone).
An "on" switch has other benefits: I value the ability to "launch" at a particular time that meets the customers expectation. This would be otherwise difficult to do because installations take time. "On" switches are virtually instantaneous
Conversely, this implies an "off" switch which can be useful in some circumstances.
Nothing is too wonderful to be true
-- Michael Faraday