I had a quick peek at this, and behaviour is the same on my Linux box.
I will do some experiments if I can narrow it down to some setting in KiCad and report on that later.
But for now:
Differential routing is not only about length matching.
It’s about keeping signal integrity along the whole path, and 2 runners running along the differential tracks with the same speed should be as close together as possible along the whole way.
Here you introduce a length mismatch for no apparent reason. If you want to use via’s here, then place them vertically, and exit the traces horizontally.
An unavoidable length mismatch is created in the corner, and the camel bumps compensate for that, so the camel bumps should be as close to the corner as possible.
The location of the S-curves is irrrelevant, as they affect both traces of the pair in the same way.
Note that the top camel bump is bigger than the bottom one.
This is probably to compensate for the length difference you introduced by misplacing the via’s, so you have skewed signals all the way from the via’s to the camel bump. Yuch!
I’m not an expert on this, just parroting from memory some stuff I read about signal integrity.
I also think via size matters, and via’s (in differential pairs) should be small and also have minimal annular rings.
Although, they are 0.8mm and 0.4mm drill which may make manufacturing an issue if you go much smaller.
Version: 5.1.6-c6e7f7d~87~ubuntu18.04.1, release build
libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Platform: Linux 5.4.0-42-generic x86_64, 64 bit, Little endian, wxGTK
wxWidgets: 3.0.4 (wchar_t,wx containers,compatible with 2.8) GTK+ 3.22
OpenCASCADE Community Edition: 6.9.1
Compiler: GCC 7.5.0 with C++ ABI 1011