In my experience include/extends works well for importing or extending whole jobs, but not so much for defining a small snippet of text that I want to reuse across many jobs, perhaps when overriding stuff.
An example of how I normally use them and why I still find them useful:
# Imports whole pipeline architecture jobs
include:
- project: company/ci-templates
ref: "master"
file: "languages/stack.yaml"
# Define a command I need to use exactly the same
# across different jobs I'm going to override
.vpn_connect: &vpn_connect
- cmd1
- cmd2
- cmd3 &
job1:
extends: imported1
script:
- ....
- *vpn_connect # 2nd command
- ...
job2:
extends: imported2
script:
- ...
- ...
- *vpn_connect # 3rd command
- ...