Checking input with the
Input singleton and using the
_input method are two very different ways of handing input.
Input singleton checks realtime input states, even though it has some event-like methods. It means no matter what happens in the game or the engine, it will tell you the current input. That also means it doesn't check anything like pause mode, GUI in front of the player or text fields being in use etc, those cases are up to you to manage manually.
_input method (and its
_gui_input counterparts) go the other way around: they gets called only when input changes (or events) actually occur, so it doesn't run every frame, only when it needs to. Because of that, it is often preferred when GUI interaction comes in, because the engine can decide when your code gets called (i.e if a window blocks the mouse, it will send clicks to the script on that window, and not the game behind it).
All this design didn't change much in 3.0, check this http://docs.godotengine.org/en/3.1/tutorials/inputs/inputevent.html