Ok,
Here is my experience playing with i2c on Arduino using the Wire library over the past 4 years and with using the DS3231 for around 3 years in clock project. (A word clock).
You haven't said which "Arduino" you are using. Each core provides its own Wire library.
I have run into Wire library issues in the AVR, pic32 and esp8266 cores, and the SoftWire avr "soft" Wire library.
I have worked with the chipkit guys and the esp8266 to get most of the issues I ran into on those cores fixes.
There is one still outstanding on the pic32 but it is a h/w issue and so it requires a s/w work around. This issue is not something that normal sketch code will see as it occurs when probing the i2c bus looking for slaves.
On the AVR I ran into an issue that causes the Wire library to lock up. It is a case where the Wire code is trying to support multi-master but a misbehaving slave tricked the AVR into thinking another master was wanting the bus. The AVR backs off and waits for the other Master to finish. Since there was no other master, and the AVR Wire library does not timeout, the AVR wire code is hung in a loop waiting for an interrupt that never occurs. i.e. it locks up the AVR.
I have only ever used Master mode but this is the only issue I have ever seen when using the Wire library on the AVR.
And in this case it is due to a misbehaving slave. The slave responds to a read as if it were a write and that is what confuses the AVR code.
I've spent quite a bit of time playing with various h/w and s/w i2c libraries (while developing my hd44780 library) and I haven't had any lockup or issues with them in normal use unless there was a h/w issue like incorrect pullups , bad power, bad wires, yanking or inserting slaves, or misbehaving slaves.
I've not attempted to use slave or multiple masters.
I built a word clock that uses a DS3231, and htk1633 (which is also i2c) to run the LEDs in a matrix to light the letters.
The processor was a Teensy2. The clock ran continuously for just over 2 years with no issues (I'm currently making mods to it).
Internally I use unix epoch time (I ALWAYS use unix epoch time as it is the most efficient way to track time and time calculations and adjustments are super easy).
The time is tracked using the Time/TimeLib library the RTC is accessed using the DS3231RTC library .
The Time library syncs with the RTC every 5 minutes through the DS3232RTC library.
The htk1633 is accessed over i2c using the Adafruit_LED backpack library which uses the Wire library.
Granted this is a very limited test case, but so far I haven't seen any issues that would cause me to seek out another i2c library other than than the bundled Wire library.
The project has recently been modified to use a esp8266.
There are lots of options available when using that module since it has built in wifi.
You really don't even need an RTC with that module as you can sync to an NTP sever.
The current implementation of the modified wordclock project I'm playing with still uses the Time/TimeLib library, the DS3231RTC but now uses the WifiManager to attach to the local network then uses the timezoneapi.io sever to get the local time to set the local time in the RTC.
timezonapi.io is very cool. It can get your local time from your location which you can give it in many forms from just a city, an address, GPS coordinates, or it can figure it out based on your IP address - which is what my clock uses.
The wordclock syncs to timezonapi every day at 2:00am to catch the DST changes.
This makes things nice as this clock has no LCD or any user interface other than two buttons to set the time.
Alternatively, I think it would be better and much simpler to drop the RTC and the Time/TimeLib libraries and use the built in esp8266 NTP support and the bundled gnu proper time libraries.
That way, you can use the WifiManager to also get a gnu TZ timezone string. Once you hand that TZ string to the time library functions, the built in NTP support will track time and you have access to the proper unix time functions like localtime(), ctime() etc... which will do any/all needed timezone and DST adjustments. All with no need for any 3rd party time libraries or RTC.
The only reason I'm not jumping on that right now is that for this wordclock is I'm not yet ready to depend on a network and there is a fall back mode to using the RTC (which is how it worked when it used the Teensy2) and for the time being it is easier to use the Time/TimeLib and RTC code I already had when just using the RTC and no network.
For future projects, I'll look at moving to using full NTP and TZ string support.
There are curently some issues in the esp8266 ntp library in how it attempts to handle timezone offsets.
They really screwed it up. I've been talking to the developers/maintainers of the esp8266 core and I'm in the process of putting together a patch/pull request to fix it.
But if you avoid all the timezone offset stuff in the ntp library and let the gnu time library handle it using the TZ string, it all works as it should. The TZ string and the normal unix time library functions is by far the best way to handle time, timezone and DST adjustments. The APIs have existed for more than 3 decades and they "just work".
The AVR tools (and hence the Arduino IDE) includes the gnu time library functions, but IMO they f*&* up big time.
They do use epoch time, but they changed the epoch from Jan 1, 1970 to Jan 1, 2000.
This really didn't buy them much other eliminating a few compares during leap year calculations; however it creates many issues since it is the wrong epoch. They also screwed up their leap year calculations after year 2100.
For i2c backpack LCD support, I use my hd44780 library which auto locations the i2c address and auto configures the pin mappings and active backlight level.
--- bill