The GC cleans some amount of garbage each pass. It does not necessarily release it to the OS (if it thinks it would just have to request it again shortly); and if it does, the OS does not necessarily reclaim it (until there is memory pressure from another process, the OS may leave that memory allocated to your process in case it needs it again).
Live heap size is how much of the heap is actively in use, less any dead objects and free heap space ready for future allocations. Goal heap size is how much memory GC thinks it needs to get from the OS to handle your process's allocations on an ongoing basis without having to constantly request more memory from the OS (i.e. how much stays alive + how much is allocated & discarded between GC runs).
The goal of GC is to clean up dead objects in the heap, and to maintain enough free heap space to handle most allocations without having to request more memory from the OS (which is slow), while also not keeping excessive free memory (so that the OS can still allocate to other processes).