Improving Speed of Cross Apply
Always verify if the join is returing correct number of rows from each join.
Try this,
;With CTE as
(
 select l.*, city.*
from  listings l
cross apply (
     select  top (1)  c.UnicodeName, c.name,c.regionid
     --, r.code as region, cn.code as country 
     from cities c
     --inner join regions r on r.regionid = c.regionid
     --inner join Countries cn on cn.CountryId = r.countryid
     where c.location.STDistance(l.location) is not null
     order by c.Location.STDistance(l.location) 
 ) as city
 )

 select c.* 
  ,r.code as region, cn.code as country 
 from CTE C
 inner join regions r on r.regionid = c.regionid
 inner join Countries cn on cn.CountryId = r.countryid
 OPTION (MAXDOP 1, RECOMPILE);

Has Estimated number of rows decrease.
Is difference between Actual number of rows and Estimated number of rows decrease.