Legal, entendi seu problema.
Por causa do ângulo da câmera o acerto no chão ocorre um pouco depois da posição do personagem, e quando estamos olhando para a direita e esquerda isso fica mais aparente. Para corrigir isso podemos mexer na angulação da câmera.
Também daria pra corrigir usando Raycast em objetos mas dando menos trabalho e até mostrando uma forma diferente de fazer a mesma coisa (que é um pouco mais difícil), poderíamos ter um código da seguinte forma:
Criamos um raio apontando para a posição do mouse como já temos.
Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
Depois ao invés de usarmos o nosso chão para fazer a colisão com o raio, nós criamos um plano usando como normal, o lado que ele aponta, a direção para cima e a posição ficaria bem onde queremos que a mira fique, por isso pensei em algo como criar uma referência ao local da mira:
Plane plano = new Plane(Vector3.up, posicaoMira.transform.position);
// lembre-se de criar e preencher a variável posicaoMira
Em seguida podemos usar o Raycast no plano que usa uma variável de distância como referência de qual a distância do raio quando ele tocou no plano e apontamos nosso jogador para essa direção:
float distanciaColisao;
if (plano.Raycast(raio, out distanciaColisao))
{
Vector3 localColisao = raio.GetPoint(distanciaColisao);
localColisao.y = 0; //ou transform.position.y
//direcao para onde vamos olhar baseado onde estamos
Vector3 posicaoParaOlhar = localColisao - transform.position;
Quaternion novaRotacao = Quaternion.LookRotation(posicaoParaOlhar);
GetComponent<Rigidbody>().MoveRotation(novaRotacao);
}
Assim temos mais precisão e controle de onde nosso raio está saindo e onde ele está colidindo.
Referência
Acho que isso soluciona o problema e aproveitamos e vimos uma forma nova de fazer.