I guess I kicked this off, so I should continue...
That's how they work in theory. In practice, checked exceptions are incompatible with standard interfaces. You can't pass checked exceptions through Runnable or List or Iterator or any of the other interfaces we use ever day, so they end up getting wrapped in a RuntimeException. Even interfaces like Future are a wreck - they throw ExecutionException, which is no better than having RuntimeException but still makes you type a lot of annoying boilerplate.
When was the last time you saw a clean stacktrace, without any wrapping? I've never seen one in an application of any sophistication. Each time wrapping happens you get farther and farther from any kind of meaningful ability to handle the error. ServletException? Really?
Plus the checked exceptions in the Java standard library are incredibly badly designed. UnsupportedEncodingException when calling String.getBytes("utf-8")? Just wow. "Let's make programmers type a lot of useless crap everywhere!"
C#, Groovy, Scala, Ceylon, Kotlin - pretty much every language post-Java abandoned checked exceptions. You can even work them out of Java using projectlombok. As someone else said, "the programmers have voted on this experiment with their feet".
Jeff