I do not think that Idea 3 would be over engineering, and I'd hit that road.
Building @MessageDriven Bean "adapter" that handles incoming socket connections in the onMessage method is easy to develop and from there you're in the well scaling EE world.
You your case, you might even want to rely on UDP. See following example: http://www.apprigger.com/2011/06/javaee-udp-resource-adapter-example/
But from my point of view there are other important reasons to go this way. Some pointers:
1.) As you've already mentioned. Building an own Socket Server handling threads and requests is a lot of work, and at the end you might build your own little "application server".
2.) Don't be afraid of using an application server. Of course people tend to call such a platform "overhead". Though when I did measure the amount of time to call other services or ebbs, using local interfaces did cost less than 10 microseconds a call. Having your own thread pools & workers and handling them yourself might be faster, although also not close to 0 microseconds ;-)
3.) Having an AS you're able to configure your instance boundaries very easily. Even more important you may scale your application a lot easier than self made software. Imagine having a cluster run on 2+ servers (and you will if your MMO is a success ). A network loadbalancer works for all kind of architectures, though having the possibility to share session informations (probably not for gamers connections, though why not for logged in users sessions) or entity mangers over clustered nodes is just "free" in the EE package.
All these EE tools & patterns give you time to develop the game instead of a framework ;-)