That separate "set time zone" step is a bit awkward, so assuming that's necessary for every tz-dependent operation, I'd likely create a Postgresql function that performs the comparison. Then you can call it just by select([func.name_of_my_function(x, y)]), and additionally you can call it multiple times within a single statement.
that said, doing the conversions in Python and only exposing the database to pure UTC values is very simple using the tz module and I'm not seeing what the disadvantage to that approach is. It's how I do it, among other things it allows the code to be database agnostic (we run the same app against Postgresql and MS SQL Server here).