If you pass the input to an instance of nn.Module via:
output = model(input)

the __call__ method will be called, will register hooks (and potentially perform other bookkeeping), and will then call forward, which is why you need to define this method.
If you want to call a custom method, either call it in forward or directly via output = model.forward_feature(input). The latter case will of course skip the hook registration etc. so don’t rely on these features.