The way I do this is I have a camera_base Node3D, and the camera is the child of camera_base.
I make the base smoothly follow any object using lerp() (the camera obviously follows as it’s the child of base), then you can change the camera’s local position to zoom. I use lerp() to zoom too, but tweening it’s position (not global_position) should work too.