So, after some testing I found out the following:
1. For non-English text, I tested with 2 multibytes languages and string.StartsWith works as good as UTF8StartsText. Is it just luck and there are corner cases which UTF8StartsText works correctly while string.StartsWith doesn't, I don't know.
2. For English I have no doubt that they both works correctly
3. It looks like some functions in LazUTF8 are missing optimizations opportunities. In C/Rust and FreePascal's StartsWith everything resolved to fast methods of comparing bytes in memory without copy or new allocations
4. having 4 options to check if a string starts with another string is just

but I understand how we come to this..
Thank you all for the help