The problem is one of control - not mechanical construction.
Most hobby servo's were originally designed for applications like radio control air craft. In that application, the servo is moving a control surface that is typically very light - minimal inertia - but your robot arm has quite a bit of mass / inertia - that makes a difference.
The typical servo has an internal feedback controller that will move the servo to the target position, stop, and hold. So, the servo feedback controller has to be tuned to get the motor started, run at high speed, then bring the motor to a stop at the target position. With very little inertia connected to the servo it is easy to stop it. But when you add a lot of inertia, the feedback controller would have to be re-designed to start stopping the rotation sooner so it doesn't overshoot. For industrial applications, the control system is tuned knowing about how much inertia the arm has - that isn't an option with the typical hobby servo - and that's why you see the overshooting and oscillations.
How to fix it? Well, you will have to insert yourself into the controller somehow. If you got the servo position fed back into your micro-controller, you could play with how you command the servo position. For example, instead of just commanding the final desired position, you could command the servo to move about 95% of the way to the target, and then when when you see the servo is getting close, you could slowly ramp the commanded position to the final target. Or, you could command the servo to go to the final target, but when it gets close, command it to move away from the target to start the braking action. When it comes to a stop near the desired target, then command the desired target and it might just sit there.
This would be an exercise in outsmarting the feedback control built into the servo by using your micro-controller to create an additional feedback loop around the servo feedback loop.