You don’t have to recalibrate the Gyro before every rotation.
Please, try to avoid using fabs(Gyro.value()) function.
For PID starting from any heading you can calculate error=Gyro.value(vex::rotationUnits::deg)-targetDeg
Then turn only as long as fabs(error)>someThreshold.
You may also refer to this example: Drivetrain gyro turning - #3 by jpearman