There are two kinds of entities that read C source code: compilers (and I guess interpreters) and programmers.
If you don't include the appropriate headers, the compiler has to guess the prototype of any library functions your program uses. For simple functions like getch()
the guess is likely to be correct, but that's not always the case & incorrect guesses can lead to mysterious bugs.
So if for some reason you don't want to include a particular header you should (at least) explicitly provide a correct prototype for the functions you use.
However, while compilers can tolerate all sorts of sloppy coding it's considered bad practice to inflict such sloppiness on human readers of your code. And that human reader may be yourself months or years later. So make it easy on yourself and other people who look at your code and make your code as easy to read as possible.
Most long-time programmers will agree that reading one's old source code can be an exercise in embarrassment. So develop good coding habits now and avoid the embarrassment later. :)
As others have noted, conio.h and getch() are non-standard, so including conio.h instantly lets anyone know who reads your code that it's targeting a Microsoft environment, and hence may require significant modification to run on any other type of system.
PS. It wouldn't surprise me in the least if some Microsoft compilers automagically include conio.h or even stdio.h or stdlib.h when required...