Help with more realistic camera recoil

Hello. This is a problem i’ve been having quite a while. My goal is to achieve a realistic (or more realistic) camera recoil effect, similar to that of Insurgency. The current camera recoil effect I have is quite good, but it is also quite lacking. The main problem with it is the jitter. When you look at it, it is rough, and doesn’t look very natural. As well as that, if you’re getting a high framerate, your recoil will be very small, but if you have a low frame rate, there will be more recoil, and it will be jumping a lot more. This method has the recoil happening in a single frame, and the return to center is done over time.

Here is a video showing off this camera recoil system

This is the code I have used to handle it
private Vector3 CameraRecoil1;
private float shoottime;

    void Update () {
        Recoil2();

        Transform cameraClimb = generalSettings.cameraClimbHolder.transform;
        string fireMode = weaponSettings.CurrentWeapon.fireMode.ToString();

        //For Pistols
        if (fireMode == "Semi")
            if (Input.GetButtonDown("Fire1"))
                Shoot();
            else
                CameraRecoil1 = Vector3.Lerp(CameraRecoil1, new Vector3(0, 0, 0), Time.deltaTime * cameraRecoil.z / 6f);

        //For Rifles
        if (fireMode == "Auto")
            if (Input.GetButton("Fire1"))
                Shoot();
            else
                CameraRecoil1 = Vector3.Lerp(CameraRecoil1, new Vector3(0, 0, 0), Time.deltaTime * cameraRecoil.z / 4f);
    }

    void Shoot ()
    {
        if (shoottime <= Time.time && !isBusy && !isReloading && !isRunning)
        {
            shoottime = Time.time + weaponSettings.CurrentWeapon.fireRate;

            WeaponInfo currentWeapon = weaponSettings.CurrentWeapon;
            Vector3 cameraRecoil = weaponSettings.CurrentWeapon.cameraRecoil;

            CameraRecoil1 = Vector3.Lerp(CameraRecoil1, new Vector3(-cameraRecoil.x, Random.Range(-cameraRecoil.y, cameraRecoil.y), Random.Range(-cameraRecoil.z / 2f, cameraRecoil.z / 2f)), Time.deltaTime * cameraRecoil.z);
        }
    }

    void Recoil2 ()
    {
        Vector3 cameraRecoil = weaponSettings.CurrentWeapon.cameraRecoil;
        Transform cameraClimb = generalSettings.cameraClimbHolder.transform;

        cameraClimb.localEulerAngles = CameraRecoil1;
    }

This is somewhat not the result I am aiming for. I have tried other methods, where rather than it happening in a single frame, it happens over a short time, but this looks too artificial and the weapon looks like it’s just being rotated up. Here is a video of the assault rifle camera recoil effect i’d like to achieve

Does anyone have any idea how I could achieve this effect?

Another way to do it, would be to Lerp the position of the camera to a position you want. This would be smoother. Once the player stops firing, slowly lerp it back down. Something like that.