I do not think there is any difference in performance between making a junction of one table with another, or a table with itself. I have no data to support this answer, except the absence of evidence to the contrary (I could do benchmarks to prove this - in different Dbms - but from the logical point of view it is the same thing one or the other).
(lie: there is the possibility that they are even more efficient that external joins - since there is only a set of meta-data, indexes and data itself to store in memory during a query. But this is speculation, only benchmarks could prove this in fact.)
If you mean implementing a tree structure using self Join, it’s not a good idea, but not because of the performance issue - but because it complicates certain queries too much (particularly if the tree is deep). But the queries you can do, should be as efficient as queries with joins to other tables.
But other uses should be ok. I just added a new answer to the linked question, giving another example of practical use of self Join (in this case, a left Outer Join). Unfortunately I can not talk much about his performance, because although I have implemented it in a real system, this has never had a large volume of data or accesses, so I do not know what will be his performance when/if it reaches large scale.
P.S. By the way, there is nothing in the self joins that violates in itself the normal forms. You might as well have a standard model with references from a table for yourself.
At least in the times I used (common in accounting, when an account references your mother account) it worked very well both in SQL and in those damn 4GLs that were fashionable in the 80/90’s. Self-join has always been considered an elegant solution.
– epx