Você acertou exatamente o 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.
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.
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 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);
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(ray, 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
Bons estudos!