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ê precisar equilibrar com base apenas no número de conexões (digamos), o balanceador de carga da camada 4 deve ser suficiente; por outro lado, se você deseja 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 de, digamos, tráfego). Os problemas são óbvios - pense em "inspeção de nível de pacote", "roteamento de protocolo" etc. - coisas muito mais complicadas do que simples "roteamento de pacote".
O último ponto que quero destacar é que o HAproxy é o espaço do usuário (pense "muito mais fácil de personalizar / ajustar", mas mais lento (desempenho)), enquanto o LVS está no espaço do kernel (pense "rápido como o inferno", mas rígido como o kernel) ) Além disso, não se esqueça de "atualizar o LVS pode significar alteração do kernel - ergo, reinicie" ...
Em conclusão, use a ferramenta certa para o trabalho certo.