Basically I have come to the same conclusion as you in my question about returning json in a custom router.
It seems to me the “default routing” in kirby via c::set("routes") is not using the custom router logic internally (?) which lead to a lot of confusion for developers trying to use the custom router for advanced functionality (such as route filters e.g.): things that work perfectly in c::set("routes") suddenly don’t work anymore in custom routers and visa versa. 