I'm a Ruby guy, but I do recognize that PHP deployment is generally fast, smooth and easy.
But yes, generally Passenger does the trick.
It must be me, though, because every time I mention it, someone accuses me of being an idiot or trolling.
Small websites with low cohesion between pages can probably get away with scp or rsync and nothing else. For a more highly trafficked website, you'll hide server instances from the outside world as you update their files and configuration. But this still isn't rocket science.
I haven't done PHP work for almost 5-6 years, but when we did it, I had post-commit scripts set up in SVN (or was it CVS back then?) that if a commit was tagged "production" would trigger the production server to perform a fresh checkout. That was the only deploy step needed.
Funny, but you can get the same type of setup working with any language. Scp a WAR file into the appropriate Tomcat directory and your Java project is good to go (no reloading of the appserver required). Or, if you have auto-reloading of modules setup in Python, you can do the same thing.
So, this type of deployment isn't just for PHP... but with PHP it is the default (only?) method.