Tchoupitoulas scripts essentially modify your classes (nodes) to do what you want. So yes, scripts are how you do what you want to do. Your objects/resources can be edited in the Inspector visually without scripts, but not much else.
Scenes are less memory intensive because they are built inside of the engine. However, scripts are more flexible as they extend what your nodes can do.
Now, this is a VERY simple example, but take....
For instance, let's say you want to make a graphic spin. You could use an AnimationPlayer node to run an animation, then use a simple script to play it at ready(). However, you could also use code and do this every frame.
func _process(delta):
$MyGraphic.rotate(0.001)
This would have the same effect. Now if you have a very LARGE scene though, the more code you execute, the slower the performance. It's a balancing act. The best practice is to save large collections of nodes that depend on each other as scenes and then use code for everything the editor can't already do. Make sense?