Unfortunately, I didn't have enough time to properly figure out how to smoothly pack circles on a curved surface. If I'm not mistaken, I ended up using the Rhino command FlowAlongSrf. The only problem is that you have to bake the packing circles to a boundary similar to surface you are projecting on to, which can be a bit tricky depending on how wonky your surface is.
Apart from that, I had to fix the edges because the packing circle function I was using still left a few gaps here and there.
Also, FlowAlongSrf can be really slow. I'm not saying Grasshopper's much faster though.