At my workplace each machine on the farm runs two web servers one with the production code and the other with the final QA code. Come release time once a week we switch the network so the final QA web servers become production then update the old production web servers with the next QA version in the pipeline.
No maintenance downtime and the final QA code is checked on the exact same production machines.