Why is the player lagging?

When I start the game and just when I move, the player body (the standard capsule) is weirdly glitching.
This is the code of the player character itself:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    private CharacterController controller;
    public int speed = 0;
    private GameObject cam;
    public float gravity;
    private float currentGravity;
    Vector3 finalMovementVector;

    void Start()
    {
        
        controller = gameObject.GetComponent<CharacterController>();
        cam = GameObject.FindGameObjectWithTag("MainCamera");

    }

    void Update()
    {

        Vector3 position = new Vector3(transform.position.x, transform.position.y + 2f, transform.position.z);

        cam.transform.position = position;

        finalMovementVector = Movement() + Gravity() ;
        controller.Move(finalMovementVector * Time.deltaTime);

    }

    Vector3 Gravity()
    {
        Vector3 downforce = new Vector3(0, -currentGravity, 0);
        currentGravity += gravity * Time.deltaTime;

        if (controller.isGrounded)
        {

            if (currentGravity > 1f) currentGravity = 1f;

        }

        return downforce;
    }

    Vector3 Movement()
    {
        Vector3 movementVector = Vector3.zero;

        movementVector += transform.forward * Input.GetAxis("Vertical");
        movementVector += transform.right * Input.GetAxis("Horizontal");

        movementVector *= speed;

        return movementVector;
    }
}

This is my camera code:

using Palmmedia.ReportGenerator.Core.CodeAnalysis;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camera : MonoBehaviour
{

    private GameObject player;

    void Start()
    {

        player = GameObject.FindGameObjectWithTag("Player");

    }

    void Update()
    {

        float horiz = Input.GetAxis("Mouse X") * Time.deltaTime * 1000f;
        float vert = Input.GetAxis("Mouse Y") * Time.deltaTime * 1000f;

        transform.Rotate(-vert, horiz, 0);

        transform.localRotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, 0);

        player.transform.localRotation = Quaternion.Euler(0, transform.eulerAngles.y, 0);

    }
}

Can somebody tell me why this happens and maybe how I can fix it?

The issue should be your camera movement and player both being in update. Try putting your camera movement code in LateUpdate so that it moves after the player moves.

     void LateUpdate()
     {
 
         float horiz = Input.GetAxis("Mouse X") * Time.deltaTime * 1000f;
         float vert = Input.GetAxis("Mouse Y") * Time.deltaTime * 1000f;
 
         transform.Rotate(-vert, horiz, 0);
 
         transform.localRotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, 0);
 
         player.transform.localRotation = Quaternion.Euler(0, transform.eulerAngles.y, 0);
 
     }

Hope this helps