Task: Fix use of custom `dt` in `transpile` when target is provided (Qiskit/qiskit#11995)

org: Qiskit
repo: qiskit
pr_number: 11995
issue_title: Fix use of custom `dt` in `transpile` when target is provided
issue_body: <!--\r\n⚠️ If you do not respect this template, your pull request will be closed.\r\n⚠️ Your pull request title should be short detailed and understandable for all.\r\n⚠️ Also, please add a release note file using reno if the change needs to be\r\n  documented in the release notes.\r\n⚠️ If your pull request fixes an open issue, please link to the issue.\r\n\r\n- [ ] I have added the tests to cover my changes.\r\n- [ ] I have updated the documentation accordingly.\r\n- [ ] I have read the CONTRIBUTING document.\r\n-->\r\n\r\n### Summary\r\nFixes #11994, I am not too sure if I should label it as a feature or a bugfix, I think it's both. This PR is currently blocking #11996.\r\n\r\n\r\n### Details and comments\r\n\r\n
resolved_issues: number: 11994
title: Scheduling stage doesn't use custom dt when target provided
body: ### Environment\r\n\r\n- **Qiskit version**: 1.1.0\r\n- **Python version**: 3.10.0\r\n- **Operating system**: MacOS\r\n\r\n\r\n### What is happening?\r\n\r\nThe expected behavior of `transpile` when a custom `dt` is specified (i.e. sth like `transpile(qc, backend=b, scheduling_method="asap", dt=dt / 2)` is that the scheduling stage will use this custom `dt` instead of the backend's one, but this behavior is not respected if the input backend contains a `target`. I believe that the root of the issue is that `dt` is encoded in the `inst_durations` object that is passed around, but the [`TimeUnitConversion` transformation pass is designed to overwrite `inst_durations` if a target is specified](https://github.com/Qiskit/qiskit/blob/main/qiskit/transpiler/passes/scheduling/time_unit_conversion.py#L43-L46), so the custom dt never gets to be used:\r\n```\r\n# TimeUnitConversion init\r\nself.inst_durations = inst_durations or InstructionDurations()\r\nif target is not None:\r\n     self.inst_durations = target.durations()\r\n```\r\n\r\nIn other words, the priorities are not consistent between the preset passmanager/transpile and the `TimeUnitConversion` pass (one prioritizes the custom durations, the other prioritizes the target).\r\n\r\n### How can we reproduce the issue?\r\n\r\nThis snippet works for the V1 backend and doesn't for the V2 backend:\r\n\r\n```\r\nfrom qiskit import QuantumCircuit\r\nfrom qiskit import transpile\r\nfrom qiskit_ibm_runtime.fake_provider import FakeHanoi, FakeHanoiV2\r\n\r\nbackend_v1 = FakeHanoi()\r\nbackend_v2 = FakeHanoiV2()\r\ndt = 2.2222222222222221e-10\r\n\r\n# from test_change_dt_in_transpile\r\nqc = QuantumCircuit(1, 1)\r\nqc.x(0)\r\nqc.measure(0, 0)\r\n\r\nfor b in [backend_v1, backend_v2]:\r\n  # default case\r\n  scheduled = transpile(qc, backend=b, scheduling_method="asap")\r\n  org_duration = scheduled.duration\r\n\r\n  # halve dt in sec = double duration in dt\r\n  scheduled = transpile(\r\n    qc, backend=b, scheduling_method="asap", dt=dt / 2\r\n  )\r\n  print(b, scheduled.duration == org_duration * 2)\r\n```\r\n\r\n### What should happen?\r\n\r\nThe custom dt shouldn't be bypassed.\r\n\r\n### Any suggestions?\r\n\r\nI think that this issue could be fixed if we establish a consistent priority of the custom `inst_durations` over the target's. A PR with a fix proposal will follow.

Reference solution:
fix_patch: diff --git a/qiskit/transpiler/passes/scheduling/time_unit_conversion.py b/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\nindex d53c3fc4ef6a..e0931133c52e 100644\n--- a/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\n+++ b/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\n@@ -42,15 +42,16 @@ def __init__(self, inst_durations: InstructionDurations = None, target: Target =\n         Args:\n             inst_durations (InstructionDurations): A dictionary of durations of instructions.\n             target: The :class:`~.Target` representing the target backend, if both\n-                  ``inst_durations`` and ``target`` are specified then this argument will take\n-                  precedence and ``inst_durations`` will be ignored.\n-\n-\n+                  ``inst_durations`` and ``target`` are specified, the ``inst_durations`` argument\n+                  will take precedence and ``target`` will be ignored.\n         """\n         super().__init__()\n-        self.inst_durations = inst_durations or InstructionDurations()\n-        if target is not None:\n-            self.inst_durations = target.durations()\n+        if inst_durations is not None:\n+            self.inst_durations = inst_durations\n+        else:\n+            self.inst_durations = (\n+                target.durations() if target is not None else InstructionDurations()\n+            )\n \n     def run(self, dag: DAGCircuit):\n         """Run the TimeUnitAnalysis pass on `dag`.\ndiff --git a/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml b/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml\nnew file mode 100644\nindex 000000000000..c1436948f953\n--- /dev/null\n+++ b/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml\n@@ -0,0 +1,7 @@\n+---\n+features:\n+  - |\n+    The :class:`.TimeUnitConversion` transformation pass now gives precedence to the ``inst_durations``\n+    argument over the ``target`` argument. This fixes an unexpected behavior in :meth:`.transpile` where\n+    custom ``dt`` inputs would be ignored if a ``target`` was provided too (directly or as part of a \n+    :class:`.BackendV2` instance).\n\\ No newline at end of file\n