A coisa mais importante que diferencia as duas soluções (LVS, HAproxy) é que uma está trabalhando na camada 4 (LVS) e a outra na camada 7 (HAproxy). Observe que as referências de camadas são do modelo de rede OSI.
Se você entender isso, poderá usar um no lugar certo. Por exemplo: se você precisa equilibrar apenas com base no número de conexões (digamos), o balanceador de carga da camada 4 deve ser suficiente; por outro lado, se você quiser balancear a carga com base no tempo de resposta HTTP, precisará de um tipo de camada superior de LB.
As desvantagens de usar um LB de nível superior é o recurso necessário (para a mesma quantidade, digamos, tráfego). Os pontos positivos são óbvios - pense em "inspeção de nível de pacote", "roteamento de protocolo", etc - coisas muito mais complicadas do que o simples "roteamento de pacotes".
O último ponto que quero fazer é que o HAproxy é userspace (acho "muito mais fácil de personalizar / tweak", mas mais lento (performance)), enquanto o LVS está no kernel (pense "rápido como o inferno", mas rígido como o kernel). Além disso, não se esqueça de que "atualizar o LVS pode significar mudança no kernel - ergo, reboot" ...
Em conclusão, use a ferramenta certa para o trabalho certo.