The easy solution is to just enable full page caching. On single server setups, something like WP Super Cache works well. On distributed setups like WordPress.com, this is more appropriate: https://github.com/Automattic/batcache
[1]https://codex.wordpress.org/Class_Reference/WP_Object_Cache
It used to persistent via writing objects to the filesystem but it actually ended up being _slower_ in some configurations.
The problem is WP just makes a ton of simple queries - in any complex install the bottleneck is probably going to be network latency to the database.
I have some hypothetical numbers illustrating the impact of network latency: http://www.tocker.ca/2013/11/18/how-important-is-it-to-merge...
The simple queries are basically free once they get to MySQL. Query cache does not help.