Doesn't matter how tightly coupled one thing is to other if that other thing never changes. I've found it generally more productive over the years to focus on seeking fewer reasons for things to change, to seek stability, than to make them easier to change by trying to achieve the loosest form of coupling possible. Decoupling I've found to be very useful, to the point where I sometimes favor modest code duplication to decouple packages. As a basic example, I had a choice of using my math library to implement an image library. I didn't and just duplicated some basic math functions which were trivial to copy.
Now my image library is completely independent of the math library in a way where no matter what sort of changes I make to my math lib, it won't affect the image library. That's putting stability first and foremost. The image library is more stable now, as in having drastically fewer reasons to change, since it is decoupled from any other library that could change (besides the C standard library which hopefully should never change). As a bonus it's also easy to deploy when it's just a standalone library that doesn't requiring pulling in a bunch of other libs to build it and use it.
Stability is very helpful to me. I like building a collection of well-tested code which has fewer and fewer reasons to ever change in the future. That's not a pipe dream; I have C code I've been using and using again since the late 80s which hasn't changed at all since then. It is admittedly low-level stuff like pixel-oriented and geometry-related code while a lot of my higher-level stuff became obsolete, but it is something that still helps a lot to have around. That almost always means a library that relies on fewer and fewer things, if nothing external at all. Reliability goes up and up if your software increasingly depends on stable foundations that find few or no reasons to change. Fewer moving parts is really nice, even if in practice the moving parts are much greater in number than the stable parts. It still helps my sanity a lot to know that the entirety of a codebase doesn't consist of moving parts.
Loose coupling is in the same vein, but I find often that loose coupling is so much less stable than no coupling. Unless you're working in a team with far superior interface designers and clients that don't change their mind than I ever worked with, even pure interfaces often find reasons to change in ways that still causes cascading breakages throughout code. This idea that stability can be achieved by directing dependencies towards the abstract rather than the concrete is only useful if the interface design is easier to get right the first time around than the implementation. I often find it reversed where a developer might have created a very good, if not wonderful, implementation given the design requirements they thought they should fulfill, only to find in the future that the design requirements change completely. Design is much harder to get right than implementation if you ask me with large scale codebases trying to fulfill ever-changing requirements, and in that case separating abstract designs from concrete implementations doesn't help that much if the abstract design is the thing that's most prone to be changed.
So I like favoring stability and complete decoupling so that I can at least confidently say, "This little isolated library that has been used for years and secured by thorough testing has almost no probability of requiring changes no matter what goes on in the chaotic outside world." It gives me a little slice of sanity no matter what sort of design changes are called for outside.
Coupling and Stability, ECS Example
I also love entity-component systems and they introduce a lot of tight coupling because the system to component dependencies all access and manipulate raw data directly, like so:

All the dependencies here are pretty tight since components just expose raw data. The dependencies aren't flowing towards abstractions, they're flowing towards raw data which means that each system has the maximum amount of knowledge possible about each type of component they request to access. Components have no functionality with all the systems accessing and tampering with the raw data. However, it's very easy to reason about a system like this since it's so flat. If a texture comes out screwy, then you know with this system immediately that only the rendering and painting system access texture components, and you can probably quickly rule out the rendering system since it only reads from textures conceptually.
Meanwhile a loosely coupled alternative might be this:

... with all the dependencies flowing towards abstract functions, not data, and every single thing in that diagram exposing a public interface and functionality of its own. Here all the dependencies might be very loose. The objects might not even directly depend on each other and interact with each other through pure interfaces. Still it's very hard to reason about this system, especially if something goes wrong, given the complex tangle of interactions. There will also be more interactions (more coupling, albeit looser) than the ECS because the entities have to know about the components they aggregate, even if they only know about each other's abstract public interface.
Also if there are design changes to anything, you get more cascading breakages than the ECS, and there will typically be more reasons and temptations for design changes since every single thing is trying to provide a nice object-oriented interface and abstraction. That immediately comes with the idea that each and every single little thing will be trying to impose constraints and limitations to the design, and those constraints are often what warrant design changes. Functionality is much more constrained and has to make so many more design assumptions than raw data.
I've found in practice the above type of "flat" ECS system to be so much easier to reason about than even the most loosely-coupled systems with a complex spiderweb of loose dependencies and, most importantly to me, I find so few reasons for the ECS version to ever need to change any existing components since the components depended upon have no responsibility except to provide the appropriate data needed for the systems to function. Compare the difficulty of designing a pure IMotion interface and concrete motion object implementing that interface that provides sophisticated functionality while trying to maintain invariants over private data vs. a motion component that only needs to provide raw data relevant to solve the problem and doesn't bother with functionality.
Functionality is so much harder to get right than data, which is why I think it's often preferable to direct the flow of dependencies towards data. After all, how many vector/matrix libraries are out there? How many of them use the exact same data representation and only differ subtly in functionality? Countless, and yet we still have so many in spite of identical data representations because we want subtle differences in functionality. How many image libraries are out there? How many of them represent pixels in a different and unique way? Hardly any, and again showing that functionality is much more unstable and prone towards design changes than data in many scenarios. Of course at some point we need functionality, but you can design systems where the bulk of the dependencies flow towards data, and not towards abstractions or functionality in general. Such would be prioritizing stability above coupling.
The most stable functions I've ever written (the kind I've been using and reusing since the late 80s without having to change them at all) were all ones that relied on raw data, like a geometry function which just accepted an array of floats and integers, not ones that depend on a complex Mesh object or IMesh interface, or vector/matrix multiplication which just depended on float[] or double[], not one that depended on FancyMatrixObjectWhichWillRequireDesignChangesNextYearAndDeprecateWhatWeUse.
high cohesionone without the other is a waste of effort and illustrations fundamental lack of comprehension of either.