Primero, para aclarar: Nginx es un servidor web, con todas las características y la complejidad que conlleva. También tiene capacidad de almacenamiento en caché, pero ese no es su objetivo principal de diseño.
Varnish no es un servidor web. No puede cumplir ese papel (de todos modos, no sin un VCL verdaderamente malvado). Su función es almacenar en caché el contenido proporcionado por otro servidor. Si es necesario, puede alterar la solicitud o la respuesta.
Si nginx puede manejar su tráfico, entonces es suficiente. Si nginx no puede mantenerse al día, entonces una forma de aumentar su capacidad es colocando un caché frente a él y haciendo que el caché maneje tantas solicitudes como sea posible.
Como ejemplo, utilizamos Apache para ejecutar una serie de sitios web PHP relativamente complejos desde un grupo de servidores web. Cuando comenzamos a experimentar problemas de capacidad, colocamos un par de servidores Varnish frente al clúster de Apache. Los hosts Varnish ahora manejan el 85% de todas las solicitudes entrantes sin molestar al backend de Apache.