Thanks!, after a lot of tweaking, I finally got a function that works faster than Perl's join, it looks really horrible though:

(defun join (separator list-of-strings)
  (declare (optimize (speed 3) (space 2) (safety 0)))
  (declare (type simple-string separator)
       (type list list-of-strings))
  (let* ((len (+
           (* (1- (length list-of-strings)) (length separator))
           (loop for s in list-of-strings summing (length (the simple-string s)))))
     (output (make-string len)))
    (loop for s in list-of-strings
      for index upfrom 1
      with output-index = 0
      when (> index 1) do (loop for c across separator
                    for output-index-1 upfrom output-index
                    do (setf (schar output output-index-1) c)
                    finally (setf output-index (1+ output-index-1)))
      do (loop for c across (the simple-string s)
           for output-index-1 upfrom output-index
           do (setf (schar output output-index-1) c)
           finally (setf output-index (1+ output-index-1))))
    output))