On one level, all computer hardware has primitives capable of expressing various control structures.
The process of "user-defining" a particular control structure is then the process of writing a compiled high-level language.
That process of devising a language and compiler is usually quite difficult, because it involves a careful study, long experience, and a delicate settlement of human factors. Human factors is ultimately the only reason for high-level languages - otherwise, everything can be done with assembly language and integers.
When an already high-level language attempts to furnish a limited set of primitives by which all other concepts are supposed to be implemented, the usual casualty is human factors.
The goto statement (in languages which have it) is the all-purpose solution to control structures which don't easily fit within the standard set of control structures. Often, there is only a very small amount of extra syntactic fuss to using goto instead of the standard control structures.
But the reason languages do not retain only the goto statement, is because it is convenient to have and to use a set of standard and widely understood control structures, which are sufficient on their own to express all possible computation.
And the reason goto is highly discouraged, is precisely because "user-defined" structures outside those standard ones already furnished, are usually misconceived. But it's there for some legitimate residual cases.
Finally, interpreting your question as strictly as possible as being about the definition of custom blocks, with an identifying keyword, and further elements which control details of how the block behaves, there are languages like C with macro preprocessors, in which it is often possible to cobble together what appear visually as custom block structures, and which when compiled are replaced with a more elaborate set of primitive statements.