Success! I went ahead and took gnasen's recommendation and created outlines for all of my tile clusters. I decided to simplify the process by simply generating horizontal and vertical segment shapes instead of poly shapes for each connected component. This should make updating the collision shapes pretty straight forward at runtime. The algorithm for building it initially is pretty straightforward - just scan horizontally looking for exposed tops and bottoms of the tile, then another vertical scan for exposed sides. Not worrying about connecting the segments makes it much simpler to work with.
I figure if I need to deal with collision callbacks for specific tiles I can either figure out the tile based on the position it collided on the segment, or just enter sensor shapes for every tile. Anyway, here's a little screenshot of it working (ignore the temp art I grabbed off of a google search