This is unfortunately wrong, and because of this pervasive confusion we should probably move away from using the words "existential" and "universal" to refer to impl Trait altogether.
That is, impl Trait is existential in argument position, as a parameter of that type can hold a value of any type that satisfies the constraint. This is isomorphic to the usual claim that impl Trait is universal in argument position- the function type and parameter are interchangeably universally quantified.
impl Trait in return position is really neither existential nor universal, at least not in the senses used above. If it were existential, the function would be able to return more than one type dynamically. If it were universal, the caller would be able to control the return type, like str::parse or Iterator::collect. It's probably more useful to think of it as a controlled form of type inference, along with its cousin existential type (new name pending).