Here's how to see what's going on:
http://play.golang.org/p/RaSrm4_P8_
Note that HeapObjects does stabilize, so goroutines are collected. This loop does not leak memory.
However, if you remove the call to runtime.Gosched(), HeapObjects keeps growing.
That's because goroutines can't be freed until they run, and they can't run until the scheduler is called, and the scheduler runs automatically only for blocking I/O operations. Similarly, memory is automatically collected only during memory allocation attempts. For your program, that means the goroutines can't run until time.Sleep() and even then may not be collected before the program exits because no allocation is attempted.
--Glenn