How can I avoid using the Update function in this example?

Use code tags please, as outlined in the sticky thread at the top of every forum.

If you need to move an object manually every frame, then you need to get called every frame to do it. You could, and probably should (at least, I prefer it), move all of your input checks to a single “input handler” class and generate events that other scripts can add listeners for. In that case, PlayerMovement would just have a function it registers to receive “mouse button down” events and respond appropriately when those events are received.

That doesn’t really save you any performance when compared to the single script here though, it’s just about efficiency when dealing with dozens of scripts all looking for inputs. If this object needs to be moved every frame, there’s not really a more efficient way to do that. You can remove the Update entirely (assuming another script handles input) and create a coroutine for motion that stop when the object becomes idle again, but you’re trading a trivial processing cost each frame for startup costs for the coroutine each time you need it, which would be often. That’s more efficient for occasional events, but not ones that are needed near-constantly.