Well, "compressing" an empty file with 7z lzma maximal compression creates a 70-byte file (zip created 100-byte file), but a lot of that will be file info overhead (name of file, ...).
In general, if your string is mostly text [A-Za-z0-9_{}()/.!@#$%^&*()-_=+|\\\[\]<>,.?] (that's ~100 different characters), you will probably crunch the string to smaller than 90% of original even with extremely primitive methods, + overhead. That's definitely a win for strings of 1001 bytes and more.
In reality, you will get much better rates, but it will probably still be best to compress every time, then check which is smaller (compressed or uncompressed), then send a flag and the smaller version. Or use a compression library that already does that by default.
Bandwidth will depend on the slowest point between your server and client, and there will be additional overhead added there too. But decent compression shouldn't be too taxing on your CPU. But best compression is one that can use pre-existing shared (==doesn't need to be transmitted over the wire with each piece of data) knowledge about the structure of your data (i.e. if you know that your string will only contain certain words, then replace those words with something shorter; or when you can generate some data from a random seed and then just transmit that seed).
In the end, I would recommend testing performance in a "real" situation, with some variants of solution (never compress, always compress, do both and pick smaller to transmit; possibly with variants where "less than X bytes" is always non-compressed and "more than Y bytes" is always compressed and everything in between sends the smaller of compressed/noncompressed; ...)