It's been a while since I made a concerted effort on this topic, but I'd love to see what you come up with the current version.
One issue I ran into was that falling water creates mist, which washed contaminants off dwarves, but the mist might spread to either side of your designated washing area, causing contaminants to drop on the floor outside of it where there's no liquid flow to remove them. For me, this killed the viability of any shower-type system.
Another problem I ran into was that contaminants are unaffected by gravity, so toggling a grate/hatch/whatever doesn't cause them to fall out of the way.
At some point I think Toady caused flow to have a chance of destroying contaminants in addition to moving them? So I started using a 1x3 ramp trough set into a 3-wide hallway, with 2/3/3 or 2/2/3 water depths, so there's continuous random flow, but no evaporation or impassible terrain. The theory here was that the flow would create a self-cleaning trough. I didn't test exhaustively, but it seems like the contaminants usually were moved from the floor of the trench to the walls of the trench, where they won't harm anyone.
Before that, I would install a few decontamination troughs in parallel, with each one having a separate dedicated airlock to cut off all access, a bridge to atom smash the liquid (which doesn't kill contaminants), and metered water and magma supplies for each trough. The sequence would be dwarves pass through for a while, accumulate contaminants, seal the airlock, smash the water, let magma in (which does destroy contaminants), smash the magma, refill the trough to 2/7 or 3/7, open the airlock.
That required a bit of careful bridge/floodgate arranging and some logic to semi-automate it all, but was generally sufficient for keeping the really deadly environments at bay.
None of those were great solutions, since none of them offer instant contaminant destruction that would protect anything not wearing shoes that immediately follows a source of contaminant through the trench.
I hope there's something that works! I've never seen a real solution posted here.