The Iterator trait has a bunch of useful default methods. Implementors of the trait can choose to override these default methods to the point where they don’t do what they claim to do. I would rather be sure that with an implementor of Iterator I can always call zip(), and it will do exactly what I expect it to do.
Defining zip() as a function that takes the trait object as an argument gives this assurance, but you loose the convenience of being able to call zip() on the actual Iterator object.
These un overridable trait methods could also maybe be allowed to use impl Trait without having to worry about “traits returning traits” problems, since they would really just be concrete functions with the added shortcut of being able to be called with by iterator object.