For example, while debugging I often have an input that allows me to reset the current scene. But, I don't use this so often, so maybe checking every frame in Update() is unnecessary?
I'm aware of InvokeRepeating(). But if I'm checking for GetButtonDown(), won't I need to press the button on the exact frame the invoked method is called?
Calling the input method in every frame isn't very slow. But you could check the input every x seconds and store the result in some class variable and use this variable for input detection. Expect some input latency with this method. The better approach in my opinion is to use the new input system:
Some tutorial for setting up this system
With this input system, you can create your own InputAction and subscribe to some event of it. An example would be:
new PlayerInput().Gameplay.Shoot.performed += OnShoot;
The PlayerInput class was generated by unity according to my settings in the editor:
