I believe part of the answer is that keywords are interned for more efficient memory usage and key lookup performance in maps (and perhaps also other data structures), since Clojure
= in most cases does a fast check for
identical? first, returning true if they are identical. This enables them to give better performance characteristics than other values when used as map keys, as keywords often are in Clojure programs.
That said, keyword interning does have a performance cost when they are first interned. This is usually not a big issue with keywords, especially for most Clojure programs where there are a relatively small set of keywords used. It has been a performance issue for people reading huge JSON files and converting a huge variety of JSON key strings into Clojure keywords. Improvements have been made to Clojure in the past, motivated by such use cases. I do not have the JIRA tickets handy at the moment, but can find them if there is interest in looking at those.
Symbols are not intended to be performance-optimized for those use cases, which is slightly worse for performance if you do try to use them as keys in maps, but I believe they also therefore avoid the performance cost of interning when a new symbol is encountered.
There is some history of similar behavior in Common Lisp, and probably some other Lisp family languages.