If you write every node script as a single responsibility object, you are achieving the purpose of composition. Extension/subclassing should still be for single purpose, but maybe in a different way (like how DirectionalLight2D and PointLight2D both extend Light2D, or VisibleOnScreenEnabler2D extending VisibleOnScreenNotifier2D)
Don’t be afraid to add nodes, don’t clump functionality into one single node, if your code starts to become big, look at functionality that could be separated.