I've just found a way which seem reusable and efficient.
I created a new scene with the following structure:
the textureRect has its layout set to fullrect so it matches the button's size and is set to appear behind its parent
The button itself has all its styles set to StyleBoxEmpty so we don't see its background but we can see its text.
All the necessary events are connected in the script and trigger the animations which affect the scale and modulate of the textureRect.
This scene being a button, I can change its label/size, etc from where it's instantiated and it reacts correctly to any layout container.