All of these hooks are called in a similar fashion and get passes similar data. Under normal circumstances there should be no meaningful performance difference between them.
One scenario I can think of is that if you aren’t properly targeting your code to specific queries and it runs in every query then posts_search
might fire less time, because other two are conditional on suppress_filters
in query being disabled.