This definitely happens in the real world, in fact it is the basis for the very popular trade called ETF arbitrage. There are many reasons that this happens, the primary being that you haven't actually looked at the correct prices to assess the presence of an arbitrage- in order to actually perform creation or redemption of the ETF in a zero risk fashion, you need to be able to immediately buy the ETF at ask and sell the components of the basket at bid or vice versa- you can't generally trade at midpoints with any degree of reliability. This means that when you're looking at the NAV of the ETF, you should consider every value between the NAV computed with only basket asks and NAV comuted with only basket bids as potentially reasonable prices.
Beyond that, there are some fundamental reasons for gaps, a big one being dividends. Generally, ETFs will pay dividends with some regular cadence, say monthly or quarterly, but their components will be paying dividends with their own cadences. This can lead to the ETF accumulating a cash balance which is not part of it's redemption basket between it's own dividend intervals, and which will generally be factored into the fair value of the ETF.
Also in regard to liquidity, some ETFs that have some highly illiquid components might price those components in a different way than the market as a whole does. You see this a lot with bond ETFs, which tend to trade a lot more than their underlyings. It's possible that market participants have collectively priced one of the constituents at a meaningfully lower or higher value than what you see on the book, either for fundamental reasons or because if you were to actually perform creation or redemption you would realistically need to pay a premium or a discount to actually get enough shares to perform the trade- and these types of discounts can be systematically lopsided. Some shares for example might be easily available to purchase but might be hard to borrow, or have very high borrow costs which also need to be factored in.
Edit
I just noticed that the gap you observed for DJD lasted not for days or weeks but years. That type of gap is probably caused by having a problem in your basket data. Did you update the basket every day in your test, or is it possible that the basket changed at the time when you started to observe the difference?