https://nodejs.org/dist/latest-v10.x/docs/api/clus...
Сам по себе кластер, на всех ОС кроме винды, делает accept соединений в мастер процессе и передает воркерам уже установленное tcp соединение с клиентом, это позволяет балансировать нагрузку алгоритмом round-robin (каждому воркеру дается примерно равное количество соединений, так как они раздаются строго по очереди), но это же накладывает издержки на передачу файлового дескриптора соединения между мастер и воркер процессами при каждом соединении.
Вариантов оптимизации тут 2:
1. Nginx должен открывать соединения с бэкендом в режиме keep-alive. Так минимизируются издержки не только на передачу соединения воркеру, но и вообще на его открытие, что даст ощутимый прирост производительности под нагрузкой.
2. Вместо модуля cluster использовать обычный child_process и управлять передачей соединений вручную, а точнее передавать не уже открытые соединения, а слушающий сокет. В этом случае балансировка будет происходить на уровне ОС. Как пишут в документации к cluster, это может привести к неравномерной загрузке воркеров, так как соединение будет доставаться тому воркеру, который первым успеет сделать accept. Зато уберет издержки на передачу каждого соединения между процессами. Но даже при этом варианте, keep-alive крайне желателен.