Acho que isso depende da carga que você espera receber, mas os modelos escolhidos pelos dois sistemas são arquitetonicamente diferentes.
Primeiramente, o nginx usa um modelo baseado em eventos para manipular pedidos, enquanto o Varnish usa um modelo baseado em encadeamento.
O Varnish coloca seu conteúdo em cache em uma árvore de críticas muito eficiente. Eu não consegui descobrir qual implementação é usada pelo nginx.
O nginx deve ser mais eficiente porque usa um modelo baseado em evento sem bloqueio para distribuir a carga uniformemente com o mínimo de contenção possível, no entanto, se os tempos de pesquisa do cache forem muito mais lentos, você poderá cancelar as coisas.
Varnish cria pools de thread (normalmente de muitos threads, 500 ou mais) para lidar com multi-processamento. O custo aqui está na troca de contexto, especialmente se você tiver muitas solicitações para processar.
Do jeito que eu vejo - o verniz terá um melhor desempenho à medida que você aumenta o número de núcleos que você tem para combater a contenção, além de seu algoritmo de cache realmente muito bom torna suas pesquisas e respostas muito rápidas. Use verniz se você tiver muitos núcleos e tiver muito tráfego / conteúdo para entregar.
O Nginx, por outro lado, tem uma abordagem muito menos flexível com o gerenciamento de recursos e eu acredito em caches pequenos / médios em sistemas de baixa potência que provavelmente funcionarão melhor em termos de eficiência e solicitações por segundo.
No geral, o verniz funciona melhor em um sistema dedicado com pelo menos 2 CPUs / núcleos. Ele irá escalar linearmente à medida que você adiciona cpus.
O Nginx provavelmente funciona melhor em um sistema multi-rolagem menor, em que a pressão do cache não é tão alta. Ele também será dimensionado linearmente, mas suspeito que seu algoritmo de cache e implementação não seja tão bom quanto o do verniz, o que pode acabar sendo um gargalo de desempenho quando você alcança altos níveis de tráfego.