I'm guessing, that this is in screen-space coordinates (so somewhere between 0,0 and 1280,1024 as an example):
Vector2 mouse = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
And the player position is in world-space coordinates (may be even 1000000, 1000000 as an example):
Vector2 direction = mouse - player.GetPosition();
So subtracting the two may end up with seemingly random results!
It may be a mistake on my side, but I guess GetPosition based on its name does not do any transforming...
So you have to either transform the mouse position from screen-space coordinates to world space (e.g.: by using your view matrix) or transform the player position to screen-space, but the first one seems more "appropriate" and more useful (you may use the world position of the mouse for other stuff too, like when hovering an enemy you could display its health-bar or something like that).
Plus, this is just a hint to help you write tidy code:
if(Mouse.GetState().LeftButton == ButtonState.Pressed)
{
int speed = 5;
Vector2 mouse = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
Try to call Mouse.GetState only once per frame, and use the fileds/properties of that cached instance in your code (button pressed state, X, Y etc...).
There is no real reason to get the state multiple times per frame, the state structure is rather big + it may call down to OS level to poll the sate (may not be exactly a cheap call).
Br.