"""Performance for generic functions seems to be slower until you have 40 different source files for if/else."""
Not true - see my test results below. Adding just two monkeypatches to your hand-tuned jsonify brings your benchmark down to being 50% slower than the generic function version.
Oops. I mean 35% slower. I was looking at 2.xx vs 3.xx without including the 'xx's in the division. :)