C é baixo nível, mas é mais fácil e prático que assembly no geral.
Como C tem que ser portátil, você não escreve instruções de assembly diretamente, porque cada arquitetura vai ter suas próprias instruções.
Mas se você precisar, você pode escrever instruções de assembly no C.
Já vi fazerem isso em códigos de jogos de N64, onde a performance do código C não é suficiente. Exemplo:
__asm__("movl %edx, %eax");
Mas pensa o seguinte, o código do kernel Linux é majoritariamente feito em C, e kernels são coisas extremamente baixo nível.