One thing I don't think Godot's documentation makes obvious enough for newbies:
Strings are often not just Strings! Often times you will come across examples of functions being called via String, when really what the function takes is a StringName or a NodePath
StringName is used commonly in places like Input where you want to compare strings.
var did_jump = Input.is_action_pressed("jump")
This code is actually using the String "jump" to construct a StringName. Each StringName points to the same location, so two StringNames can be compared for equality far faster than normal Strings can. However, creating a StringName from a String is itself kinda slow. A good practice is to cache your StringNames so you only construct them once. Here's one way:
@export var jump_str := StringName("jump")
var did_jump = Input.is_action_pressed(jump_str)
This way all the engine is essentially doing is checking an int comparison!
NodePath is used by functions like get_node.
Calling get_node with a String will construct a NodePath with the String. To make things quicker and less prone to error, one thing you can do is exporting the NodePath.
@export var path_to_some_node:NodePath
This will appear in the inspector as a field you can drag and drop another node into, and if that Node's name or location changes, the NodePath will update automatically.
Resources in the filesystem don't have their own unique kind of String, but you can still get similar automatic behavior using the export alternatives @export_file and @export_dir. When the resources are moved within Godot, the exported Strings will be updated accordingly. If something goes wrong, say for instance the files get moved in Git but the references weren't updated, Godot can try to automatically repair the broken paths.