Tbh I'm very new to godot and gamedev (started this fall), so I'm not sure I am the good source for the good practice, but happy to share how I didi :) There are multiple ways to save - the one I use is easier in the "save/load" part but might require some code organization.
Basically, you need to turn all the data you want to save into a dictionary. The dictionary can have any "classic" types of values - including vectors, arrays and other dictionaries. So you can next dictionaries in dictionaries to help you organize it. It has a way to save "objects," but it is less safe, if I got it right, and also looks more complex, so I didn't yet look into it.
And then you just do to save:
var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE)
file.store_var(save_data)
And to load:
var file = FileAccess.open("user://save_game.dat", FileAccess.READ)
var save_dict = file.get_var()
Itch allows for access to "users" which is some folder in "localfiles" or something like that. More details on this here: https://docs.godotengine.org/en/stable/classes/class_fileaccess.html#class-filea...
In my case, I just store a dict with 4 things: a dictionary for my tilemap values (which I use for logic anyway), positions of all magic crystals, the progression in the day number, etc, and the chosen difficulty. I also do the same for settings and store them in a separate file. And then the "hard part" is to make your game generate from the dictionary - some values you can just assign (like day number), but for some, you need to write functions - like, in my case, setting tilemap layers from the values in the dictionary. It's not hard if you already have a separation of logic and objects because you do translations between them anyway. I already stored my tilemap in a value grid, so I made a conversion between tilemap layers and dictionaries before I thought I'd add save/load. But it also requires more maintenance - if you change tilemap, you need to make sure you adapt your save/load structures accordingly - I failed a bit here, as after I added "half-healed tiles" I didn't add them to the load, so all half-healed tiles load as fully-corrupt.