The Play example was totally unfair since it blocks on the database query which will block the underlying event loop and really lower the overall throughput.
The problem is that the database queries were done in a blocking fashion. The test essentially blocks the main event loop which is of course going to kill performance.
The play test was written totally incorrectly since it used blocking database calls. Since play is really just a layer on top of Netty it should perform nearly as well if correctly written.
That's because they inexplicably use the Jackson library for the simple test, rather than Play's built in JSON support (they use the built-in JSON for the other benchmarks).
Both Netty and Play use Jackson though one the Netty version uses a single ObjectMapper and the Play version uses a new ObjectNode per request (created through Play's Json library).