Having worked on another language that targetted the C language, and having looked at that time for a LLVM backend, the most problematic thing with the C backend was when the C code had errors and failed to compile. You get C errors that are difficult to trace back to the original code.
However, as user of Nim, I never felt this way. The C backend must be strong enough that it appears completely transparent. As a matter of fact, I had forgotten that Nim did not compile to native code because it's so well integrated. Other reasons why you would like to avoid targetting C directly would be to link to symbols that are reserved keywords in C (and would not compile), or to use other low level features that C does not give access to: specific memory layouts, use of registers, ...