Почему зависает сайт при 30-40 одновременно выполняемых запросах?
Из всего что я понял, получается у вас в callback-хендлере делается запрос через curl куда-то ещё (через proxy) и тем самым воркер из пула web-сервера держится до момента окончания выполнения запроса. Ваш сервачок быстро исчепает пул веб-воркеров, даже если вы увеличите их до 100 и хватит памяти. Конечно, это плохое решение. 
Да, в сущности нужно реализовывать систему очередей. 
Вам нужно как можно быстрее выполнять пришедний запрос-колбек и освобождать пул. Для этого нужно ограничить его работу тем, чтобы положить необходимые данные в какое-то хранилище или передать сообщением в менеджере очередей, делегировав работу по отправке другому пулу воркеров. Например 1-4 воркерам/демонам на ReactPHP или Node.js, которые будут брать пачку заданий и асинхронно рассылать запросы.
1) Если PHP работает через FPM - увеличить количество процессов покуда хватает памяти/процессора
2) Если работает через апач - выкинуть апач и поставить FPM, затем повторить п. 1
3) Если уж хотите очереди - скармливайте запросы серверу очередей, клиенту отдавайте ID задачи, а клиент раз в N секунд пусть опрашивает завершилась задача или нет