Looking at the Head First Java book (specifically the section "Ducking (by declaring) only delays the inevitable"), your sample meets their definition of "ducking," but that doesn't mean there's a problem. The only issue they point out is where every nested method call propagates an exception, including the main method, so that the JVM has to handle it. Even then, if you have a headless batch job where you want some exceptions to terminate the job (and you might have it logged by calling the java code from a shell script that redirects stderr to a file so exceptions get logged), this might be fine, it depends on what you need to do. It is just something to be aware of.
The whole point of exceptions is that when you run into a problem a lot of the time that place in the code is not the place to address that problem, instead you need to relocate control to another spot higher up in the call stack. In many cases the best policy is to create a global exception handler that takes in exceptions thrown from many different levels in the application (for instance, in a web application, where if there's an error in many cases the best thing to do is terminate the request, log the exception, and present an error page).
Handling an exception immediately where it's first thrown is really relatively unusual. There is nothing wrong with having a method pass on catching an exception, letting it be thrown from the method. The book is only trying to point out that eventually something should catch it.
There is a possible problem with finally blocks to be aware of. Say something goes wrong in your doStuff method that causes an exception to be thrown. On the way out the finally block gets called, and if anything is thrown from the finally block, then that exception takes precedence and the exception thrown from the try block gets lost. This is called exception masking. It's bad because usually the exception thrown by the finally is not the one you want to see, the one thrown by the try-block is the informative one. The try-with-resources statement was created to help deal with this problem by suppressing the exception thrown on close when another exception was being thrown from the try block.