I use JSR’s and have forgotten to put the JSR logic in the main program once or twice…well maybe a few more times than that.
As far as weather or not it’s good programming practice, I remember working on a punch press with multiple replaceable dies about 8 years ago. I was very grateful to the engineer that programmed it for using JSR’s. Each die had it’s own subroutine, and if that die wasn’t in place in the machine, the logic for it wasn’t scanned. The dies were connected via an amphenol plug and shared the same inputs and outputs, but had totally different functions. The same output may control a clamp on one die, a shift cylinder on another, and a stripper on a third. If I remember correctly, the first 3 pins of the amphenol plug on the die determined which JSR was used depending on which inputs were on giving 7 possible dies in one machine. Finding which subroutine was active and looking only at that logic made it much easier for troubleshooting.
Since then, I’ve had many occasions where logic only needed to be scanned under certain conditions like fault routines, or when certain stations needed to be on only when a certain part was being made. I’ve also found it easier to organize a program by using unconditional JSR’s.