Your knee-jerk reaction is misplaced. There are valid use cases for intrusive linked lists [1]:
a) When your nodes can belong to multiple lists. You can't do this with arrays.
b) When you need fast removal from the middle of the list and you already have a pointer to the list node [2].
[1] In an intrusive linked list, the prev/next pointers are members of the payload node, as opposed to a "simple" linked list, in which the list nodes contain a pointer to the payload.
[2] This happens all the time in kernels. For example, you receive an interrupt and need to remove the corresponding task from the IDLE queue and append it to the RUNNING queue.