I'll try to answer my own question, in case it helps someone else.
Yes, you should run sessions2trash periodically, even if you're using Redis and you're setting an expiration time for every session.
As the documentation states: "... when session_expiry is set [...] you should ocassionally run sessions2trash.py just to clean the key holding the set of all the sessions previously issued..."
In my deployment I have around 1000 applications running in one web2py instance. All of them set session_expiry to 2 days. The load is very stable: about 2 millon sessions in memory, using about 1gb of memory. However, while the number of sessions stays stable in time, memory usage increases slowly. I've found that running sessions2trash makes memory usage to go down to 1gb. And yes, you have to run it once for every installed app. I've inspected the source code of sessions2trash.py and I can't realise what is it that it deletes (besides the expired sessions).
It would be nice to have a script that only takes care of cleaning "the other stuff", so it doesn't take too much time to run. Consider that sessions2trash.py iterates over all the stored sessions, and if you're using Redis and you're setting an expiration time for every session, it doesn't make sense to iterate over all the dataset just to clean "that other stuff".
Hope it helps someone :)