Well, after a few hours of testing with pattern-based routing system, I've achieved what I was looking for. Oh yeah :D
Here is what I did, in case someone is trying to do the same (continuing the example of the first post).
In the web2py main folder, this is routes.py:
routes_app = [
(r'.*?://recipes.com:\w* /$anything', r'recipes'),
(r'.*?://traveler.com:\w* /$anything', r'traveler'),
]
Notice that I will serve two apps per domain, but in the routes_app I specify only the main app.
This allows me to define a routes.py for the main app of each domain.
In my case, this is applications/recipes/routes.py:
('/', '/recipes/default/index'),
('/robots.txt', '/recipes/static/robots.txt'),
('/favicon.png', '/recipes/static/custom/favicon.png'),
('/download$anything', '/recipes/default/download$anything'),
('/static$anything', '/recipes/static$anything'),
('/panel/static$anything', '/recipes_panel/static$anything'),
('/panel', '/recipes_panel/default/index'),
('/panel$anything', '/recipes_panel$anything'),
]
# for every function in the default controller
for key in ('contact', 'other_function', 'aboutus', 'myfunction'):
routes_in.append(('/%s$anything' % key, '/recipes/default/%s$anything' % key))
routes_in.append(('/$anything', '/recipes/default/index/$anything'))
routes_out = [(x, y) for (y, x) in routes_in]
Then I have applications/traveler/routes.py, which has the same content that the file before, but replacing "recipes" with "traveler".
And that's it, works like a charm.
Now there is one thing that I couldn't achieve: how to avoid all the apps being accessed from any domain?
I'll close this question and post a new question about this.