The execution control returns to the resource that has called the forward() method after the callee resource finishes processing. RequestDispatcher.forward() is also a normal method call, so the control does return to the calling resource.
I thought only include() method does that, it returns the servlet and does the rest of the process.
Both include and forward calls by request dispatcher return to the calling servlet but the basic difference is that, before the forward method of the RequestDispatcher interface returns, the response content must be sent and committed, and closed by the servlet container (SRV 8.4) whereas in case of include it is not so. Therefore after forward return you cannot write anything to the output stream since it is already closed however you can do so using include.