Не совсем так, внутри libevent использует epoll на Linux и kqueue на MacOS X/FreeBSD, отличия от select есть, и довольно заметные.
При использовании select или poll на вход этой функции передается список файловых дескрипторов, после того, как функция возвращает управление, вызывающий обязан в цикле перебрать все эти дескрипторы и проверить их состояние.
На винде нет ни poll ни тем более epoll. Последний и не на всех линуксах есть. Так что libevent использует то, что есть в системе: select в винде, а в других - по обстоятельствам...
Nginx использует фиксированное количество потоков (но никак не один, если это специально не указать в конфиге)
Попробуйте ответить на следующий вопрос: если нгинкс может использовать для работы всего один поток, то как он это делает?
Когда поймете ответ, тогда подумайте над следующим вопросом: что делают дополнительные потоки нгинкса?
А если делать по уму, и синхронизировать только передачу данных между потоками, то приложение будет масштабироваться.
Масштабироваться будет, но скорости это не прибавит, а скорее наоборот... Вот такая загогулина ))
Если есть высокие требования к производительности, то можно внедрить lock-free контейнеры...
И мы вернемся к асинхронному однопоточному приложению ))