Haproxy e Nginx não são as mesmas bestas: haproxy lida apenas com a rede e nunca toca no sistema de arquivos . Nunca servirá conteúdo estático para você. Por outro lado, ele executará uma ordem de grandeza maior do que qualquer servidor HTTP completo, como o Nginx e o Apache.
O Haproxy também é um balanceador de carga sofisticado, você precisa se acostumar com isso.
No meu caso, eu usarei nginx ou Apache para até 10.000 conexões simultâneas em servidores únicos ou configurações triviais, porque ele faz o trabalho bem e por si só. Para arquiteturas mais envolvidas (muitos servidores, alta taxa de transferência), um loadbalancer dedicado como o Haproxy é desejável.
Nginx vs Apache é um ponto moot IMHO. Eu posso escalar tanto para 10.000 clientes concorrentes em um servidor decente (digamos 4 núcleos e 4G RAM), e se Nginx é um pouco mais leve em recursos, não faz a diferença, pois na maioria das vezes o aplicativo (Rails, Django, PHP , o que é) é 90% da CPU + carga de memória.
Eu digo: use o servidor da Web com o qual você está mais confortável. OTOH é verdade googling para receitas Apache é cheio de besteira e exige para ler atentamente o (grande e muito bom) doc. Como um dinossauro Apache, estou muito satisfeito com isso. Mas se você é novo em servidores web HTTP, eu acho que o Nginx é menos intimidante e mais legal. Tanto o Apache quanto o Nginx são extremamente confiáveis.
Quanto ao PHP, eu uso o Apache com um trabalhador MPM e FastCGI. Simples e eficiente. Eu tenho documentado que há muito tempo no link : é ainda mais fácil no Debian 6.0, mas eu não documentei isso.
Sua configuração parece boa para mim (Haproxy + Apache ou Nginx, depois PHP via FastCGI). É uma boa ideia colocar o balanceador de carga em todos os servidores frontais em um nó distinto (que se torna um SPOF). E é mais simples, pois todo nó executa a mesma configuração. Adicione um IP failover e pronto.