Everything can be done in almost any language.
However, there is a level of practicality. As the complexity of your system increases, you need the best tools to manage it.
The problems are still solvable, but you need more people and much more design effort. I am not saying that other languages do not use design; I am saying that the same level and attention to detail may not be required.
Since we programmers are Human (I, at least), we have problems in one area or another. My biggest memory. If I can visualize my code as objects, managing large modules in my head becomes easier and my brain can handle larger projects.
Of course, even in C you can write good OO code, templates were developed in C by manually managing the dispatch tables (pointer tables with some pointers updated to indicate different methods), and this applies to all programming builds from higher languages - they can be made in any language, but ...
If you were to implement objects in C, each individual class that you wrote would have a large amount of service labels. If you did some form of exception handling, you would expose more patterns.
Higher-level languages abstract this template from your code and in the system, simplifying what you need to think about and debug (the distribution table in C can take a lot of debugging, but in C ++ it will not fail because the code generated by the worker by the compiler, it will be error-free and hidden, you will never see it).
I think I would say that the biggest difference (only?) Between low-level and higher-level languages is how much you hide the template. In the last series of dynamic languages, they really hide the contours of the loop inside the language, so it looks more and more like this:
directory.forEachFile (print file.name); // Not Some Real Language
In C, even if you highlighted part of the loop inside a function, setting pointers to functions and stuff will still have lines of non-obvious code that won't solve part of your main problem.