Nowadays we use abstraction to get things done, including constructs predefined by others, e.g. language contructs or configurable IP.
Sure you do. But since you think that this is the only way, what's your alternative?
The entities in a schematic are abstract, they don't exist in the FPGA.
You can create a schematic which uses logic ICs, or you can create schematic which uses built-in hardware blocks in FPGA, or you can create schematic which uses discrete FETs, or you can create schematics which uses abstract logic gates and registers. These will all be different schematics, but will do the same thing. If, for some reason, you need to produce all of these, you can write abstract Verilog code and use various tools on the same code to create all these schematics automatically. Write once, run everywhere. This is an example of a good abstraction.
But, if you want to build a bitcoin FPGA farm which produces $10M/year, and then you decide to use abstract Verilog code which is 10% slower and consumes 10% more power over what you could have developed specifically for your target FPGA, this is pure stupidity which costs you $1M/year.
As any tool, abstractions may be good or bad. For example, when you write a program for PC, there are graphics drivers which create an abstraction layer. With this model, you can write your program without even knowing what PC it will run on. Your program will run fine even on PCs with graphics adapters which hasn't been designed yet. My programs from last millennium runs fine on modern PCs. How wonderful.
Or look at the TCP/IP protocol which uses abstract packets and can be used seamlessly with different transport layers. This is a useful abstraction and 50-year old TCP/IP is widely used now even though technologies made a huge leap forward.
Or C. You can use it to write code and compile it for different CPUs. Isn't it amazing?
On the other hand, nowadays "abstraction" is used to create tremendous amount of bloat making today's software 100x and 1000x times bigger, slower, and more complex that it could have been. This introduces lots of bugs which are nearly impossible to fix, and this is getting worse and worse. That's a different kind of abstraction. People get obsessed with this form of abstraction. Perhaps not so much embedded developers, but the so called "full stack" developers. They perceive all this tremendous bloat as useful and necessary, while it is clearly harmful.
So, a designer needs skills to implement good abstraction, needs guts to reject bad abstraction, and needs brain to tell them apart.