No, I would not say the the GC and IL are tightly coupled. In fact, one can exist without the other - and sometimes that is the case.
IL's major purpose is to make it platform agnostic, and to allow the JIT to make very specific optimizations that depend on the platform. For example, x86, x64, ARM, etc. The JIT's purpose is to turn that IL into native machine code for the architecture, and optimize it correctly.
You couldn't optimize for x86 and ARM because the platforms are too different. That's why there is a JIT for each specific platform. The JIT has the luxury of knowing what platform it's going to run against. As a code author, you may not know.
GC on the otherhand is about memory management. There are plenty of Garbage Collector libraries for software that does not compile to an intermediate language. Take for example this one, which is small but gets the job done. There have been plenty of papers on the subject as well.
It is possible for one to exist without the other, that's just not how we see it very often.
So what makes a "managed" language? To me, it means there is a virtual machine of some type involved. In .NET's case, the CLR. It provides various services, such as GC, Jit, Code Access Security (CAS), etc.