Why Key-Value stores are like C, and why you might want to use one anyways
blog.postabon.com
blog.postabon.com
Your test case is ideally suited to what key/value stores are good at. Once you need joins the whole picture is going to look very differently. Thankfully you do acknowledge that in your post.
There is another issue as well. You can get good performance from key/value stores only if you know upfront what kinds of queries you're going to need. For ad hoc queries you need a query optimizer that takes statistics into account in order to make use of indexes in the best possible way. RDBMS have very sophisticated query optimizers.
One other difficulty arises when you try to make this architecture work in a multi-process scenario. Berkeley DB does support that in principle, but it's very difficult to make transactions, shared caches and recovery work reliably with processes that are started by apache modules.
Most of the other things I have read on this topic have taken a position of "Relational good, Key-value bad" or the opposite. Your take is much more useful, with some back of the envelope data to back it up.
This is part of a rift between the people writing the posts and the people spending their time building Facebooks, Googles, etc. Almost everyone I've talked to who operates (not just plans to) at HUGE scale relies on a combination of key-value stores (commonly known as memcached) and relational databases. That way you get all the speed benefits of something like BDB, without having to re-invent alternatives to SQL queries in [your language of choice] wrapping BDB.
Part 3 of a series of articles I've been writing about the technology behind http://postabon.com. This is about the persistence layer (Elephant) I'm using - but I tried to make it a little more general so it could help non-Lisp programmers.