По существу вопроса,
на беке должен быть порядок, использование js в сочетании с непониманием как правильно строить бек, приводит к популяризации мнения, что node.js на бекенде неправильное решение.
Сразу оговорюсь, неправильное решение не использование node.js на беке, а использование программиста, не знающего как строится бек, как работать с базами данных и получать от них максимум.
Отдельно про js. Имхо использование чистого js на бекенде допустимо только там, где кодовая база не превышает 200-300 кб кода, иначе могут быть сложности.
Решение, использовать ts плюс сочетание доступных фреймворков
Из того, на что можно и нужно посмотреть:
nest.js - очень сильный фреймворк, позволяющий писть как большие монолиты. так и микросервисы, очень дружелюбен к фронтэнд на angular
inversify.js - сильная DI
express (в сочетании с inversify-express-utils), fastify - низккоуровневые фреймворки для http
socket.io - сокеты с поддержкой каналов
Есть еще много чего, что закрывает те или иные бизнес-задачи, по покрытию меньше , чем у явы, но по нагрузке на машины нода будет экономичнее.
с пхп вообще сравнивать не буду, перформанса там нет.