This is why we use script extractors and inserters. You can't just insert a new byte into the ROM; that moves everything after it, and suddenly shit starts breaking all over the place. You're limited by the available space, and in gameboy games that happens to be in chunks of 0x4000 bytes apiece. So everything in 28000-2BFFF needs to stay in that range. (At least, for now. There are ways to expand but that's beyond the scope of this message.) If you expand a string at 28A94 to be an extra byte long, all the strings that come after it start at their original addresses + 1, and you have one fewer byte left in the data bank as a whole. But unless you modify the pointers, the game's still looking at the strings in their original addresses.
Let me see if I can illustrate this somehow....
0000: 1000 2000 3000 0000 0000 0000 0000 0000
0010:This's a string<END>
0020:Another string!<END>
0030:String No.Three<END>
The values at address 0000 are 16-bit (2-byte) pointers represented as hex data. The first pointer is pointing at address 0010, the second pointer is pointing at address 0020, and the third is pointing at 0030. The values at addresses 10, 20, and 30 are strings. If we assume that everything in each of these strings takes up a single byte (including the <END> marker) then each of these is 16 bytes long.
Note that the string at 0010 is lacking a period. If we add one in, then things start to look like this...
0000: 1000 2000 3000 0000 0000 0000 0000 0000
0010:This's a string.<END>
0021:Another string!<END>
0031:String No.Three<END>
The first pointer is pointing at address 0010, the second pointer is still pointing at address 0020, and the third is still pointing at 0030. However, since we added a period to the end of the first string, each of the strings after it have been offset by one byte - the second string now starts at 0021, and the third at 0031. Address 0020 is now occupied by the first string's <END> byte, while address 0030 is now occupied by the second string's <END> byte. If the game tried to display these strings, they'd start loading at address 0020 or 0030, they'd get the <END> byte, and they'd just stop loading outright.
Now, obviously, remapping all of these things by hand is an impractically huge chore. What if you mistype? You'll have to go through and change everything by hand AGAIN. This is where script inserters come into play. In the case of Atlas (which was designed to my specification and I use almost exclusively), I insert directives in the script saying "This string is pointed to by pointer 0/1/2/etc" and when the inserter puts the text into the game the inserter knows which pointer to remap and takes care of it for me. This allows me to have strings exactly as long as they need to be, and to maximize the frequently-limited available space in a given data bank. That said, while script extractors and inserters are a critical part of the project workflow, I don't expect you to understand exactly how they work just yet - I only want you to understand why they're useful.
Does that help elucidate things any?