I am not 100% clear on your goals – they are rather vaguely stated. If you want to go the lowest possible level before reaching for assembly and machine code then sure, C can teach you how are things done in x86 / x86_64 land (not very sure it can teach you much about platforms like ARM and MIPS but it probably could). Can be useful if you are very much into programming various IoT devices, car mini-computers and in general devices where even slightly higher-level system languages (D, Rust, Nim, Zig) are a no-go – but mind you, that gap is being eliminated little by little every month.
Now for my opinions.
If you want to go low level I recommend learning C only to an extent and then reach for Zig. It’s an amazing language aimed to directly compete with C and recently its author also added very valuable integration with C compilers. I strongly recommend reading this article, it’s very insightful both for C and Zig compilation!
Kudos for reaching for Elixir. It’s a secret weapon for many (myself included) and is generally underestimated – but it has a runtime (well, Erlang has, but Elixir gets it by the virtue of stepping on Erlang) that all other languages out there can only dream of: transparent green thread multiplexing on all CPU cores/threads, lag-less operation, predictable performance even under heavy load, supervision trees / auto-restarts on minor failures, message passing between actors/processes… These are things that I and many others tried to make in C++, Java, PHP, JS, Ruby, Python and other languages over the courses of our careers – and failed every time, while Erlang has been there all along.
…If you are looking for code much faster than JS, natively compiled, and with strong static typing then definitely go for Rust. As much as I love Elixir and always will, Rust beats it in no small amount of areas: it has an absolutely fantastic community (Elixir as well; it’s one of the best communities I ever participated in!) – very smart and experienced people, amazing documentation (their official online learning book has different styles depending on if you prefer to read more or exercise more), and they are very keenly aware of the shortcomings of the language compared to stuff like C++ and Java and are working day and night to erase the gap. There is a huge amount of libraries, like anything you can think of is 99% likely already there (sadly not the case for Elixir). They are also working on having a runtime like Erlang’s (the BEAM VM) but sadly that seems far away from happening just yet – no wonder, the BEAM is 30 years old. Rust can get compiled on a plethora of platforms as well. Not as wide-reaching as C but it’s pretty close.
Haskell and OCaml are other very strong contenders. But have in mind that, especially with OCaml, you will mostly be learning on your own – there are a ton of resources out there, mind you, but stuff you take for granted (like UTF-8 strings) you have to specifically take care of in those: they have libraries for them but in general you have to be much more explicit in what you want. And those languages’ strong points do require heavy upfront learning investment to become really good at (especially Haskell’s monads).
I sit somewhere a bit higher on the stack; I’d like some things to be baseline and then build on top of that (Elixir and Rust have UTF-8 strings built-in, for example). But, you know, preference.
In case it matters, in the last several years I worked exclusively with Elixir and just recently started a job with Rust. These two languages can cover like 99% of everything I ever needed in my 18.5y of career.
Lastly, to answer the title: I recommend learning C only to an extent. Learn pointer arithmetic, learn basic vtable dispatch (emulating the OOP class/method constructs), learn stack buffers and heap memory semantics. But don’t tarry on C. Just go for other languages – Rust is my top recommendation.
Hope this helps, even if it’s largely a personal take on the topics you raised.