Hallo Herr Philippi,
in Ihrem Beispiel klingt es tatsächlich auf den ersten Blick einleuchtend, dass es hier ein unerwartetes Verhalten geben würde.
Deshalb hier mal ein Gegenbeispiel 
$CMS_IF(!lt_link.isEmpty)$
$CMS_TRIM(level:4)$
Hallo
$CMS_IF(!lt_text.isEmpty && !lt_link.equals(lt_text))$
$CMS_VALUE(lt_text)$
$CMS_END_IF$
$CMS_END_TRIM$
$CMS_END_IF$
Erzeugt folgendes Ergebnis:
Hallo Welt
Gewünschtes Ergebnis, wie auch in der Doku beschrieben müsste eigentlich Folgendes sein (ohne Leerzeichen):
HalloWelt
Sind Sie sicher, dass Sie das haben wollen?
Davon abgesehen steht in der Doku:
"Alle aufeinander folgenden Whitespaces werden zu einem Leerzeichen zusammengefasst.":
http://www.e-spirit.com/odfs42/de/vorlagenentwicklung/vorlagensyntax/anweisungen/cms_trim/cms_trim.h...
User: FIRSTDoku
Pass: FSdown_V2
Genau dies geschieht hier doch 
Wenn Sie ihr Beispiel geringfügig ändern, sollte das Ergebnis eher Ihren Vorstellungen entsprechen:
$CMS_IF(!lt_link.isEmpty)$
$CMS_TRIM(level:3,char:"")$
<span class="contact">
$CMS_IF(!lt_text.isEmpty && !lt_link.equals(lt_text))$
<span class="linktext">
$CMS_VALUE(lt_text)$
<span class="separator">:</span>
</span>
$CMS_END_IF$
$CMS_VALUE(lt_link)$
</span>
$CMS_END_TRIM$
$CMS_END_IF$
Der "Trick" ist es hier, zwar einzelne Zeilen zu erzeugen (level:3), als Umbruchzeichen aber "nichts" zu benutzen, was dann dazu führt, dass tatsächlich alles zusammengeschrieben wird. Sieht mit Text zwar ziemlich häßlich aus, für Quellcode aber geeignet 
Viele Grüsse aus Dortmund,
Holger Höbbel