I agree that the database is the bottleneck. I wrote a DB caching drop-in for WordPress and got pretty deep into the various queries that are running. There really aren't any nasty joins, but the problem is that the stock WordPress install with the default theme and no plugins runs nearly 30 DB queries per page. If you install once of the really slick commercial themes then WordPress will run upwards of 100 queries on every single page view.
Even a small site with a low level of traffic can bring a modest DB server to it's knees without caching of some type. It's really ridiculous but just due to the modular nature of WordPress.