I agree with Dan that either starting a new question or branching this question to another thread would be good given the length and slight topic change.
What I will say here, though, is that reading through the script for me is made more difficult by naming rows from the cursors with names like "polygon" and "point." Typically when something is named "polygon," it is a polygon object and not a row containing a polygon object and other attributes. Maybe it is just me, but I catch myself having to go back and remind myself what exactly "polygon" and "point" are when I see polygon[0] because ArcPy polygon objects do support indexing and slicing.
Beyond variable naming, I am trying to understand why you are creating a poly_count counter when you can just check the length of the poly_names list to get the count. And I don't see poly_count actually being used anywhere.
Since Python dictionaries are not inherently spatial, looping over them and doing spatial operations on each geometry stored within them can be slow depending on how many polygons are being iterated over, but I haven't followed this thread closely until now, so maybe that discussion already happened. If so, disregard this last comment.