The adviced require still not has the right signature, in the case ad-do-it is not called, you have to set the return value yourself!

  (setq ad-return-value feature)

in your case.

You can also get rid of the defvar but it's a little far fetched. Here is what I come up with:

  (defadvice require (around require-around)
    "Leave a trace of packages being loaded."
    (let* ((feature (ad-get-arg 0))
           (require-depth (or (and (boundp 'require-depth) require-depth) 0))
           (prefix (concat (make-string (* 2 require-depth) ? ) "+-> ")))
      (cond ((featurep feature)
             (message "(info) %sRequiring `%s'... already loaded"
                      prefix feature)
             (setq ad-return-value feature))
            (t
             (let ((my/time-start))
               (message "(info) %sRequiring `%s'..." prefix feature)
               (setq my/time-start (float-time))
               (let ((require-depth (1+ require-depth)))
                 ad-do-it)
               (message "(info) %sRequiring `%s'... %s (loaded in %.2f s)"
                        prefix feature
                        (locate-library (symbol-name feature))
                        (- (float-time) my/time-start)))))))
 
  (ad-activate 'require)

Anyway, very useful advice! Let me know if it works with this version.