Well first off, input should be a singleton class in unity, attached to the camera.
Any script that needs input should register with this singleton.
a single script to rule them,
another script(per object) to bind them together.
You're giving for granted that I'm using Unity, but actually I'm using my own ECS with a different framework, so that doesn't apply. But even if it was Unity, I wouldn't do it that way and I can't see how it would help to solve my issue
I would make the enemy slow down when he gets close, then he won't overshoot.
It looks really cool to make him slow down gradually, but that is unnecessary.
That's a solution, but it requires my AIController to know about how the movement works, making it coupled with that. I would like to keep them separated instead.
How does a human player know when to release the button so as not to overshoot their mark?
That's a good question. Humans have far more inputs than my AIController though
You know that you'd release the button when you see you're about to get there to the place you want to be. So that makes tolerance an option. But it would still require my controller to know about how movement works.