You're basically correct.
"define" runs during the "init" phase of Ren'py startup, even if you don't explicitly include the define inside an "init" block. The "init" phase happens before the "load" phase when someone loads a save. Variables declared with "define" will not be included in a game save. Thus, if you change them during game play, they will be reset back to their original values if the player loads a save. That's the main issue you run into if you change them.
"default" does two things. First, it creates the variable in such a way that its value (even after being changed) will be included when the game is saved. More importantly, if you create a save with version 1 of a game that doesn't declare a particular variable and then load it into version 2 of the game that declares the variable with "default", the variable will end up being defined with the default value you specify. Thus, "default" is the safe way to add new variables to an updated version of your game. Basically, the load logic says "is that variable defined in the save file? If so, use the value there. Otherwise, set the value to the default"