сервер можно упаковать в расширение PHP, которое будет работать быстро и которое будет всегда в памяти и многопоточно.
1) с многопоточностью ты тут точно начудил. РНР не многопоточен - это раз, существующее решение, которое позволяет создать отдельный поток (thread) - глубокая бета, и оно явно не позволяет сделать параллельные запросы к БД (вылезет большой процент сигфолтов на нагрузках)...
в отдельный поток можно выделить только расчетную задачу, не имеющую разделенного ресурса.
2) упаковать код в РНР расширение - это большой труд, проще изначально все написать на Си/С++ или как предлагали выше на Java
3) как вариант можно использовать PHP-Hiphop, но он имеет свои ограничения, которые могут не подойти текущему проекту.
на это решение не подошло, так ка не было драйвера к монге и не может использовать другие ПХП расширения.
что касается вопроса топикстартера, мы в свой игре использовали толстый клиент (ActionScript), который все сам рассчитывал время на восстановление ресурса.
на серверной стороне крутился PHP демон, который принимал входящие сокетные соединения. Масштабирование задавалось round-robin при загрузке HTML страницы (выбирался один из серверов)
Если, сокетное соединение не могло создаться (Пользователь был за прокси), то обмен шел через WEB сервер. Но таких было всего 20 на 1000 пользователей.
Общие данные хранились в мемкеше, БД использовалась только при обрыве/создании соединения (сохранение данных).
Обмен данными - бинарный, на базе protobuff