FlatBuffers are not faster than structs and are not more convient than structs, but only when structs is all that you need. FlatBuffers work across more languages than C++ and allow for versioning so you can add fields later and still use buffers encoded earlier on, and you can have complex hierarchies of data and variable length strings and arrays (called vectors). Given these extra features, FlatBuffers are typically faster than other encodings that offer similar features, and often a lot faster than necessary. But if you do not need the flexibility, simpler encodings like structs can be better.
You can represent structs inside FlatBuffers and these structs will be compatible across different languages and different C/C++ compilers. The pragma pack struct is not a universal standard so FlatBuffer tools can ensure that a compiler either fails with an assertion or represents the struct correctly.
Also, FlatBuffers can work across little and big endian platforms.
You cannot have FlatBuffers that are purely structs, they must be stored in so called tables (except the FlatCC tool for C, that does allow for pure struct buffers for speed and portability). The tables can point to other tables and other structural data outside itself, and it can contain simple data and structs inside the tables memory layout.
The most important part of FlatBuffers is the version stability aspect.
Usually FlatBuffers are about 10 times slower than structs to encode, and 2 times slower to read compared to simple structs, but I depends a lot on the particular use case.
FlatBuffers can also easily be converted to JSON, so you can use the FlatBuffer schema for JSON communication, or mixed communication where some endpoints require JSON. However, only C and C++ readily supports JSON encoded FlatBuffers. The C implementation (that I wrote) supports very fast parsing of FlatBuffers into JSON and vice versa.
If you need to verify data, FlatBuffers is a bit more sensitive to malicious input than JSON or protocol buffers because it use direct access to data instead of parsing data, but it is possible to verify a buffer before accessing it, especially in C and C++.