Case-insensitive order while preserving the case of the returned strings
The solution is simple: don't use a join. This also removes the need for a DISTINCT.

select f.name
from friends f
where exists (select *
              from cities c
              where f.city_id = c.id)
order by lower(f.name);


Online example: https://rextester.com/SNA62411