If anything, I'd find a callback simple and easy to understand personally. Callback with just a list of dropped items, window reference and user pointer seems like a really good solution that avoids weird lifetime action at a distance implicit agreements ('poll for paths before next display' or something) and doesn't look weird in the API (because it'd look weird to have getPaths() in sf::Window that is only supposed to be used after a certain event is handled, and we already go away from 'pure events' to event + poll window or something so it's not consistent with all the other events).
We already have 'callbacks' in InputStreams, sort of (since function pointer or virtual function is how 'callbacks' are done pre-C++11, save for people who use third party std::function like classes), and 'white sprite because I deleted sf::Texture' is a common beginner problem already that comes from the same mistake, all the caveats that are possible here already apply in SFML. I don't see how a callback instead of polling could generate spaghetti code.