I think I have a fairly ok mental model, I guess it's just the syntax and abstractions of HDL that trips me up.
For the last time, the mental model you have is incorrect, and that is what stays in your way, not the syntax. Just put aside, for a moment, your 20+ years of programming. Let's take your example.
why I couldn't cast a 32bit result to 24bit by simply slicing it or similar (ie "counter <= (counter + 1)[23:0])
I can only speculate that is a piece of synthetizable HDL, and your intention here is to use only the first 24 bits of a 32 bits counter. Is that what you want to do? If yes, then it doesn't make sense if you think of it in terms of circuits. You had before 32 flip-flops chained as a counter, and now you suddenly want to disconnect the last 8 of them? What if another signal arrives in the meantime? How should the counter act, as a 24 or as a 32 bits counter?
If you draw a schematic of 32 chained flip-flops, and think about them in terms of schematic (and not as software) it doesn't make any sense to increment only the first 24 bits. What should the other 8 bits do? Should they just sit there, or should they increment? Maybe they should reset?
Picture them as physically minuscule ICs inside the FPGA. That's a counter. It's not data, it's a circuit.
Please put the code of the whole module, so we can discuss it line by line, and make an idea of what is happening under the hood. It's not like a typecast in programming, but enough metaphors. Put a simplified version of the whole module, say in words what you expect from it, where it does something else than you expect, and the errors spit by the IDE.
Now if you don't have the time to do that, to stay on topic about links, I'll recommend this for a FPGA 101. Seems trivially simple, but is also concise, so it can be parsed very fast. Read even the parts you think you know, and think schematics.
https://www.fpga4fun.com/That was what helped me when, after decades of programming, I stepped for the first time into FPGAs.