You need the router() method for the same reasons as in CodeIgniter, which is to capture all calls to the controller, for example because there is no one-to-one method mapping.
The before() method is a prepping method, to do some initialisation work before the requested method is called. It is not designed to alter the flow of the request.
If your login method is in a different controller, you can get away with a check in before() and if not logged in, redirect to the login controller. If your login method is in the same controller (or in your base controller), you need to use the router() method because you need to call that method instead of the requested method.
I don't know what this Markup class is doing, but it looks like you're trying to force the framework to do something it is not designed for.
Every controller method MUST return an instance of Response. All base controllers have an after() method to make sure this happens, in case your methods return something else (like a string or a View object).
As of 1.6, all included base controllers will have a router() method. For older versions, you have to add the code to the router that calls the original method requested yourself. A quick fix would be to backport the 1.6 base controllers to 1.5, and call parent::router($method, $params).
It is more clear now what I should be doing based on what I want to do. Instead of forcing a output, I used the before method to make a validation, in negative case, I just redirect the request to another controller, like you said.
The Markup class is a "helper" class I have designed to help me process views. Basically because the whole system uses the same HTML Markup, but only varies content/data, I have built a class to do that for me in a easier OOP way. Let's just say it's a class to do the process of lazy rendering views {layout {head {metas, stylesheets, head_hs}, header {menu}, content, footer, last-load-content {scripts}}