Se você precisar de vários clientes (web, aplicativos de desktop, aplicativos móveis, ...), é necessário decidir como eles se comunicarão com o (s) back-end (s). Você poderia usar o REST, isso força um conjunto de opções de arquitetura; você poderia usar (digamos) CORBA, isso naturalmente forçará algumas decisões, etc, etc, e assim por diante.
Uma vez que isso tenha sido resolvido, você pode decidir se deseja usar apenas VMs no hardware de outra pessoa, VMs em seu próprio hardware dedicado ou executar máquinas "no bare metal" (ou seja, sem uma camada intermediária do hipervisor) . Ou talvez simplesmente execute aplicativos (no Google AppEngine, por exemplo) com os quais você se comunica usando HTTP.
Os fatores determinantes são:
- custo, tanto em despesas de capital como em custos correntes correntes.
- Esforço necessário para manter tudo em funcionamento
- Expansibilidade (é relativamente rápido instalar novas VMs no hardware de outra pessoa, provavelmente demorará mais ou será caro ter máquinas não usadas por aí, se for seu próprio hardware).
- Conjunto de habilidades existentes para manter um farm de servidores em execução
- Custo na aquisição do referido conjunto de habilidades
Eu não posso, no entanto, dizer qual é a resposta certa, o melhor que posso fazer é dizer que "depende".